Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重写位枚举上的int_C#_.net_Enums - Fatal编程技术网

C# 重写位枚举上的int

C# 重写位枚举上的int,c#,.net,enums,C#,.net,Enums,我看到一些.NET 2.0代码如下所示: public enum abc : int { value1 = 1, value2 = 2, value3 = 4 } 等等 现在我知道标志enum可以用于位值(如上面所述,对吗?),所以您可以执行|“或”&,等等,但不使用它的原因是什么?重写int有什么意义 如果我设计一个用于选择多个值的枚举,我将使用flags属性,而不会覆盖任何内容(我不理解)。上面提到的方法是什么 感谢:“:int”正在指定用作枚举值的基础类型的内容;这里可

我看到一些.NET 2.0代码如下所示:

 public enum abc : int
 {
  value1 = 1,
  value2 = 2,
  value3 = 4
 }
等等

现在我知道标志enum可以用于位值(如上面所述,对吗?),所以您可以执行|“或”&,等等,但不使用它的原因是什么?重写int有什么意义

如果我设计一个用于选择多个值的枚举,我将使用flags属性,而不会覆盖任何内容(我不理解)。上面提到的方法是什么

感谢:“:int”正在指定用作枚举值的基础类型的内容;这里可以使用除char以外的任何整数类型。默认值为int,因此在本例中它是多余的。

它不是“覆盖”
int
,它指示枚举所基于的类型。默认值为
int
,因此这实际上没有实现任何功能,但在某些情况下,您可能希望基于
long
的枚举来存储更多标志,或者如果周围有很多枚举实例,并且枚举只有几个值,则基于
byte
来节省空间,但是,框架设计指南中的建议是使用
int
,除非您有很好的理由不这样做


如果这是一个标志枚举,那么它应该用
[flags]
标记,这似乎就是这里的意图,因此省略看起来像是一个错误。即使没有用
[Flags]
标记,您仍然可以使用位运算符组合这些值,但从内存中,我认为您会得到一个编译器警告(或者可能是FxCop警告,或者可能是ReSharper警告…。

我看不到任何好处。程序员可能缺乏经验。

FlagsAttribute只告诉用户可以组合此枚举中的字段;它实际上并没有将枚举的字段设置为“可标记”值。这一点,你必须自己做,就像你已经做过的那样。

如果你要求场景选择特定的值,我不知道一个好的例子,但我可以想象这样的情况

enum Color = {
  Red = 0xFF0000,
  Green = 0x00FF00,
  Blue = 0x0000FF }

可能有用。

将非标志枚举上的值设置为仅为了使用1-hot编码而使用1-hot编码实际上没有任何意义。我想,如果您认为将来可以将其作为一个标志枚举,那么这可能是有意义的。否则,不应重写这些值,也不应根据它们的含义(例如Color.Red=0xFF0000)为它们指定一个值。

对于指定基础类型的“:int”,如果我看到了这一点,我会四处看看,看看它们是否以这种方式删除了所有枚举。如果是这样,他们可能只是学会了用这种方式编写枚举(或者他们可能是一个超显式编码器)。然而,如果只是以这种方式声明了这个枚举,那么程序员可能是在试图说(最好是用注释来表示)它具有一个底层的“int”类型是至关重要的。也许它正在某个地方被二进制序列化或反序列化

至于[Flags]属性,就C#而言,您可以在任何枚举上使用位运算符,而不仅仅是那些用[Flags]声明的枚举。根据以上示例,在没有任何[标志]的情况下,以下内容完全合法:

abc MyABC值=值1 |值2

[Flags]的主要区别在于Enum的ToString()和Parse()方法。如果没有[Flags],myAbvValue.ToString()将返回“3”,但如果有[Flags],它将返回“value1,value2”。同样,对于[Flags]

abc yourAbcValue=(abc)Enum.Parse(typeof(abc),“value1,value2”)

将您的ABC值的基础值设置为3

请注意,Enum()的IsDefined()方法不允许使用[Flags]枚举的多个值,因此:

已定义枚举(类型(abc),“值1,值2”)

无论使用[Flags]如何,返回false

还要注意,[Flags]提供了任何反射访问的信息,其他语言可能会将对标记枚举的限制与普通枚举不同