1

これを行うよりかわいい方法はありますか?バイトストリームを指定して、目的の数値型に変換します。

(呼び出しコードは、ストリーム内のバイト数に関連するデータ型を処理すると仮定します)。

    public void GetValue(byte[] bytes, ref UInt16 value)
    {
        if (BitConverter.IsLittleEndian)
            Array.Reverse(bytes);
        value = BitConverter.ToUInt16(bytes, 0);
    }
    public void GetValue(byte[] bytes, ref UInt32 value)
    {
        if (BitConverter.IsLittleEndian)
            Array.Reverse(bytes);
        value = BitConverter.ToUInt32(bytes, 0);
    }
    public void GetValue(byte[] bytes, ref UInt64 value)
    {
        if (BitConverter.IsLittleEndian)
            Array.Reverse(bytes);
        value = BitConverter.ToUInt64(bytes, 0);
    }
    etc...

たとえば、オーバーロードを複製するのではなく、値のタイプをオンにすることにより、より良い方法があると思います。

4

1 に答える 1

6

配列反転の条件を抽出できます。オーバーロードはまったく使用しません。

public ushort GetUInt16(byte[] bytes)
{
    ReverseIfLittleEndian(bytes);
    return BitConverter.ToUInt16(bytes, 0);
}

public uint GetUInt32(byte[] bytes)
{
    ReverseIfLittleEndian(bytes);
    return BitConverter.ToUInt32(bytes, 0);
}

public ulong GetUInt64(byte[] bytes)
{
    ReverseIfLittleEndian(bytes);
    return BitConverter.ToUInt64(bytes, 0);
}

private static void ReverseIfLittleEndian(byte[] bytes)
{
    if (BitConverter.IsLittleEndian)
    {
        Array.Reverse(bytes);
    }
}

あなたが本当に単一の方法を目指しているなら、私は「かわいい」ことを避けて、「シンプルで読みやすい」に固執するでしょう. はい、最終的にいくつかの同様の方法がありますが、それぞれが理解しやすく、呼び出しも簡単で、基本的にメンテナンスは不要です。私にはいいですね...

于 2015-04-15T16:18:40.693 に答える