C#枚举问题自动转换==显式枚举转换?

时间:2011-06-21 07:34:29

标签: c# enums casting enumeration explicit

我对Explicit枚举转换有点困惑,这真正意味着什么......

我正在尝试使用Enumeration做一个非常酷的预期行为,并同时充当一个很好的魔术数字替换。一石二鸟。

我有这样的事情。

public enum Size {Bare, Fixed, VariableByte, VariableShort};

预期行为的美妙之处在于我正在使用的这个协议。

如果我只发送没有任何操作码命令的数据包,则称为裸数据包,这意味着缓冲区大小只是有效载荷

  

new byte [payloadSize];但[payloadSize + Bare]将是等效的

byte[] buffer = new byte[payloadSize+Bare];   //Bare = 0

如果数据包是固定的..它包含一个必须在前面附加的OpCode。所以它是

  

新字节[1 + payload];

byte[] buffer = new byte[payloadSize+Fixed] //Fixed of course = 1.

VariableByte包含前面的操作码和表示数据包大小的字节。这适用于255大小范围等的数据包

  

新字节[2 +有效载荷];

VariableShort与上面相同,不同的是数据包大小可以是单词65535有效载荷。是的

如果协议发生变化,我可能会在将来遇到问题然后我可能不得不在将来为枚举分配值来修复问题但是现在它是一个有效的枚举,从index = 0开始[谷歌搜索后我听说如果你没有以默认值0开始枚举]这不是一个正确的有效枚举..大声笑idk这意味着什么......可能会给枚举操作带来压力。

无论如何回到我的问题。

正如我已经知道的那样,我可以做如

int Ret = (int)Size.Bare;


int Ret = Convert.ToInt32(Size.Bare);
byte[] packet = new byte[payloadSize+Ret]

或者最好。

byte[] packet = new byte[payloadSize+(int)Size.Bare]

我试图避免尽可能多的编码行甚至提高性能。

我正在阅读MSDN并发现你可以这样做..我还没有真正发现它的目的,但我预测它可能意味着什么..

public enum Size : int {Bare, Fixed, VariableByte, VariableShort};

我认为这是可能的

byte[] packet = new byte[payloadSize+Size.Fixed];

byte[] packet = new byte[payloadSize+Size.VariableShort];

等...

但遗憾的是它不是,我得到了这个旧错误

运算符'+'不能应用于'int'类型的操作数和Packet.Size

所以我想知道在枚举前面放一个字节是什么意思? 因为它真的不能让我做任何很酷的事情,就像我在上面尝试过的那样。

是否仅将其限制为仅字节?什么东西或它只是为了看起来很老?

似乎没有任何限制。

byte[] buffer = new byte[payloadZie+(byte)Size.Fixed];

仍然有效,当然 int!= byte

只是想知道这可能意味着什么 如果我问了太多问题,谢谢对不起:\\ 你们在任何论坛期间提供更好的答案。

3 个答案:

答案 0 :(得分:2)

枚举提供了用于比较逻辑状态或值的switch语句和比较。 (即ConnectionState == Connected vs ConnectionState == 1)。

这里你想要的是整数值。但是,您可以编写一个包含公共字段和/或属性的类来执行您想要的操作。使它静态,你也将为编译器/ CLR提供一个很好的优化。

public static class Sizes
{
    public static readonly int Bare = 0;
    public static readonly int VariableByte = 65536;
}

您可以使用相同的方式使用它们,但现在Sizes.Bare是一个值为0的整数,您可以在添加中使用它。

答案 1 :(得分:1)

默认情况下,枚举的每个值都是int类型,第一个元素以0开头并在每个元素上依次计数(或者如果你定义[Flags] - 属性加2 ^ N)。如果您使用enum Size : byte创建枚举,则每个元素的类型将为byte,而不是int,它仍然可以转换为int,但总共限制为256个元素,因为您只有“一个字节的数字“可用。因此,如果您想将枚举用作“paket大小”,则int枚举是更好的选择。

枚举相对于具有静态int属性的类的一大优势是您可以定义枚举,例如:作为方法参数的参数类型,然后你得到一个有效的数字,但是如果你使用静态int,你也可以将参数定义为int,所以你需要检查参数如果它每次都有效。

答案 2 :(得分:0)

在枚举声明中指定一个类型只会使它使用该类型来存储枚举值,在使用枚举值时它不会改变语法。

默认存储类型为int,因此指定枚举应使用int不会改变任何内容,但澄清您特别想要使用该类型仍然有用。< / p>


如果要使用枚举的数值,则应在定义中指定它们,而不是依赖于默认值。这样,通过阅读代码,您需要它们具有特定值:

public enum Size {
  Bare = 0,
  Fixed = 1,
  VariableByte = 2,
  VariableShort = 3
};