1

我对显式枚举转换有点困惑,这到底是什么意思..

我正在尝试使用枚举来做一个非常酷的预期行为,同时充当一个很好的幻数替换..用一块石头杀死两只鸟。

我得到了这样的东西。

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

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

如果我只是发送一个没有任何操作码命令的数据包,它被称为裸数据包,这意味着缓冲区大小只是有效负载,类似于

新字节[有效载荷大小];但是 [payloadSize+Bare] 是等价的

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

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

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

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];

ETC...

但不幸的是,事实并非如此,我得到了这个老错误

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

所以我想知道在枚举前面放置一个字节转换到底意味着什么?因为它真的不会让我像上面尝试的那样做任何很酷的事情。

它是否仅将其限制为仅转换为字节?还是什么,或者它只是为了看起来很旧?

似乎没有什么限制。

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

仍然有效,当然int != byte

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

4

3 回答 3

3

枚举提供了 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 的整数,您可以在加法中使用它。

于 2011-06-21T07:45:26.210 回答
1

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

与具有静态属性的类相比,枚举的一大优势int是您可以将枚举定义为例如方法参数的参数类型,然后确保您获得一个有效数字,但如果您使用 static int,您只能将参数定义int为好吧,所以你需要检查参数是否每次都有效。

于 2011-06-21T07:43:48.407 回答
0

在枚举声明中指定类型只会使其使用该类型来存储枚举值,当您使用枚举值时它不会更改语法。

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


如果要使用枚举的数值,则应在定义中指定它们,而不是依赖默认值。这样,从阅读代码中可以清楚地看出您需要它们具有特定值:

public enum Size {
  Bare = 0,
  Fixed = 1,
  VariableByte = 2,
  VariableShort = 3
};
于 2011-06-21T07:50:42.063 回答