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

然后你就得到了一个 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

取决于需要什么,真的。如果确实需要满足任意数量的位,那么最好有一个循环,从源中逐位提取,组装值,然后在读取正确数量的位后将其写入目标. 但是,如果真的只有一组固定的宽度,那么开关和外壳就可以了(无论如何在我看来),因为它可能更清楚发生了什么。使代码比它需要的更通用是没有意义的。

在任何一种情况下,最好将所有这些隐藏在一个函数或其他一些抽象手段后面,以便它可以更容易地重用(“每次”表明这段代码会出现在几个地方),以及只写在一处的决定结果。

(我要进一步评论的是,如果使用枚举来表示一组固定的位计数,每个枚举数应该有一个任意值,而不是相应的位计数。这更好地表明该名称不以任何方式表示任意位计数,而只是表示支持的位计数之一的标记。)

(另外,当读取 16 位时,其中一个字节可能来自input[j+1].)

于 2009-02-05T23:59:36.817 回答