枚举和常量

时间:2009-02-05 23:32:15

标签: design-patterns enums constants

有没有比宣布枚举更好的方法

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
}

感谢。

5 个答案:

答案 0 :(得分: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();

这样您就可以移除开关。

答案 1 :(得分: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语句来填充。当然,您可以为每种类型的事物设置多种方法。

很难说这是否适合您的应用程序,因为没有很多上下文,但这是另一种可以在这种情况下使用的方法。

答案 2 :(得分:0)

我认为您可能需要澄清一些问题。

但是,您可以通过将枚举转换为字节(默认的枚举类型)来获取枚举的基础值。

(byte)DepthNumberSize.Bit8

将返回8.因为你实际上正在使用你给你的枚举的自定义值(它们默认为0,1,2等)会更好。它甚至可以让你摆脱整个switch语句,允许你编写一个通用的代码块,它使用枚举变量'size'的基础值来产生所需的结果。

答案 3 :(得分:0)

在这个一般范例内工作,是的:

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

答案 4 :(得分:0)

真正需要所需的东西。如果实际上需要满足任意数量的比特,那么最好有一个循环从源中逐个过滤掉比特,组合该值,然后一旦读取了正确的比特数就将其写入目的地。但是,如果确实只有一组固定的宽度,那么开关和外壳都很好(无论如何我的眼睛),因为它可能更清楚。没有必要使代码更通用,而不是它需要的。

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

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

(当读取16位时,其中一个字节应该来自input[j+1]。)