1

列挙を次のように宣言するよりも良い方法はありますか

public enum DepthNumberSize
{
   Bit1 = 1,
   Bit4 = 4,
   Bit8 = 8,
   Bit16 = 16,
   Bit32 = 32
}

また、関連するデータチャンクで実行されるswitchステートメントを使用する操作が使用されるたびに、次のようになります。

switch(size)
{
    case DepthNumberSize.Bit1:
       buffer[i++] = input[j] & 1;
       buffer[i++] = (input[j] >> 1) & 1;
       // cut
    case DepthNumberSize.Bit8:
       buffer[i++] = input[j++];
       break;
    case DepthNumberSize.Bit16:
       buffer[i++] = input[j] | (input[j] << 8);
       j += 2;
       break;
    // cut
}

ありがとう。

4

5 に答える 5

1

あなたはこのようなことをすることができます:

    interface IBitSize
    {
        object DoStuff();
    }

    class Bit1 : IBitSize
    {
        public object DoStuff()
        {
            buffer[i++] = input[j] & 1;
            buffer[i++] = (input[j] >> 1) & 1;
            return something.
        }
    }

    class Bit2 : IBitSize
    {
        public object DoStuff()
        {
           //Do different stuff here.
        }
    }

次に、次のように呼び出すことができます。

    IBitSize size = new Bit1();
    size.DoStuff();

このようにして、スイッチを取り外すことができます。

于 2009-02-05T23:49:09.833 に答える
1

代わりにクラスの使用を検討することもできます。おそらく、ファクトリメソッドを使用して、サイズに適した具象型を返します。

abstract class BitManipulator
{
    public abstract void Manipulate(
        byte[] buffer, byte[] input, ref int i, ref int j);

    public static BitManipulator Create(int size)
    {
        switch (size)
        {
            case 1: return new Bit1Manipulator();
            case 2: return new Bit2Manipulator();
            // etc.
        }
    }
}

class Bit1Manipulator : BitManipulator
{
    public override void Manipulate(
        byte[] buffer, byte[] input, ref int i, ref int j)
    {
        buffer[i++] = input[j] & 1;
        buffer[i++] = (input[j] >> 1) & 1;
    }
}

// etc. for other classes

次に、1つのswitchステートメントを取得すると、残りのコードのswitchステートメントに散らばるのではなく、すべてのロジックをサイズ固有のクラスに含めることができます。そしてもちろん、あなたがする必要があることのタイプごとに複数の方法を持つことができます。

コンテキストがあまりないため、これがアプリケーションに適しているかどうかを判断するのは難しいですが、このタイプの状況で使用できる別のアプローチです。

于 2009-02-05T23:49:31.563 に答える
0

私はあなたがあなたの質問をいくつか明確にする必要があるかもしれないと思います。

ただし、列挙型の基になる値をバイト(列挙型のデフォルトタイプ)にキャストすることで取得できます。

(byte)DepthNumberSize.Bit8

列挙型に指定したカスタム値を実際に使用するため、8が返されます(デフォルトは0、1、2など)。また、switchステートメント全体を削除して、列挙型変数「size」の基になる値を使用して目的の結果を生成するジェネリックコードのチャンクを記述できる場合もあります。

于 2009-02-05T23:49:24.480 に答える
0

その一般的なパラダイムの範囲内で作業します、はい:

   Bit1 = 0x00000001,
   Bit2 = 0x00000002,
   Bit3 = 0x00000004,
   Bit4 = 0x00000008,
   Bit5 = 0x00000010
于 2009-02-05T23:50:21.127 に答える
0

本当に何が必要かによります。実際に任意の数のビットに対応する必要がある場合は、ソースからビットを 1 つずつ釣り上げ、値を組み立て、適切な数のビットが読み取られたら宛先に書き込むループを用意することをお勧めします。 . しかし、実際に固定された幅のセットしかない場合、何が起こっているのかがおそらくより明確になるため、スイッチとケースは問題ありません (とにかく私の目には)。コードを必要以上に汎用的にしても意味がありません。

どちらの場合でも、より簡単に再利用できるように、これらすべてを関数または他の抽象化手段の背後に隠しておく方がよいでしょう (「毎回」というのは、このコードのビットがいくつかの場所で発生することを示唆しています)。 )、および決定の結果は 1 か所だけに書かれています。

(さらにコメントすると、列挙型を使用してビット カウントの固定セットを表す場合、各列挙型は、対応するビット カウントではなく、任意の値を持つ必要があります。これは、名前が任意の値を決して意味しないことをより適切に示しています。ビット数ですが、サポートされているビット数の 1 つを示す単なるトークンです。)

(また、16 ビットを読み取る場合、バイトの 1 つはおそらく から来るはずinput[j+1]です。)

于 2009-02-05T23:59:36.817 に答える