2009-02-05 114 views
1

难道还有比声明枚举作为枚举和常量

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

,每时的相关数据块进行开关操作语句中使用,如时间更好的办法:

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 
} 

谢谢。

+0

这是什么枚举acheiving?为什么不直接写16而不是DepthNumberSize.Bit16? – 2009-02-05 23:44:20

+0

枚举正在阻止使用幻数。 “1”表示一个,“Bit1”表示“第一位”。这有一点。 – 2009-02-05 23:52:01

回答

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(); 

这样你可以删除开关。

0

我想你可能需要澄清一些你的问题。

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

(byte)DepthNumberSize.Bit8 

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

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语句充斥。当然,您可以为每种需要做的事情提供多种方法。

很难说这是否适合您的应用程序,因为没有很多上下文,但这是另一种可用于此类情况的方法。这一般范式

0

工作,是:

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

取决于需要什么,真的。如果实际上需要满足任意数量的比特,那么最好有一个循环将来自源的数据一个接一个地进行比较,组装该值,然后在读取了正确的比特数后将其写入目的地。但是,如果真的只有一组固定的宽度,那么开关和外壳就没问题了(对我而言,无论如何),因为它可能更清楚发生了什么。使代码比需要的更通用是没有意义的。

在任何一种情况下,将所有这些隐藏在函数或其他抽象方法后面可能会更好,以便它可以更容易地重用(“每一次”都表明这一小部分代码作物在几个地方),而决定的结果只写在一个地方。如果使用枚举来表示一些固定的位数,每个枚举应该有一个任意值,而不是相应的位数,这更好地表明这个名字不在任何位置绝不意味着任意比特数,相反却是一个简单的标记表示支持的比特数之一)。

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