有没有比宣布枚举更好的方法
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
}
感谢。
答案 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]
。)