質問

タグとして列挙を宣言するより良い方法はあります
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
}

感謝します。

役に立ちましたか?

解決

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

    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();
あなたはスイッチを削除することができます。

この道ます。

他のヒント

あなたは例えば、サイズに適した具体的な型を返すために、おそらくファクトリメソッドではなく、クラスの使用を検討することもできます。

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文を通じて散らばっすることができます。そしてもちろん、あなたはあなたがする必要があるものの種類ごとに複数のメソッドを持つことができます。

これは、コンテキストの多くがないとして、これはあなたのアプリケーションに適しているかどうかを言うのは難しいのですが、それはこのような状況で使用することができます別のアプローチです。

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

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

(byte)DepthNumberSize.Bit8

あなたが実際にあなたが列挙型を与えたカスタム値を利用すると思いますので、それは良いだろう8を返します(これらは0、1、2、などにデフォルト設定します)。それも、あなたが希望する結果を生成するために列挙型変数「サイズ」が根底にある値を使用するコードの一般的なチャンクを書くためにできるように、あなたは全体のswitch文を取り除くことを可能にする。

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

   Bit1 = 0x00000001,
   Bit2 = 0x00000002,
   Bit3 = 0x00000004,
   Bit4 = 0x00000008,
   Bit5 = 0x00000010

本当に、何が必要かによって異なります。それはビットの任意の数に対応するために、実際に必要なら、ビット源のうち一つずつ魚のループを持っている方が良いでしょうビットの右の数が読み込まれた後、値を組み立て、その後、先に書き込み。本当に幅の唯一の固定セットがある場合、おそらく何が起こっているか明確であるとしてではなく、その後、スイッチとケースは、(とにかく私の目に)大丈夫です。それが必要以上に多くの一般的なコードを作るない点はありません。

いずれの場合も、おそらく、それがより簡単に再利用できるよう、機能の後ろに隠れて、このすべて、または抽象化の他の手段を持っている方が良いでしょう(「たびは、」コードのこのビットがアップ作物ことを示唆していますいくつかの場所で)、そして唯一の場所に書かれた判定結果ます。

(私はなるだろう以上のコメントは、ビット数のいくつかの固定セットを表すために列挙型を使用している場合、各enumerantは、対応するビットが数えるのではなく、任意の値を持つべきであるということである。よりよいこれは名前はどのような方法でないことを示しています任意のビット数を意味するが、サポートされているビット数のいずれかを表す単にトークンむしろである。)

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top