[Flags]属性真的有什么作用?

Meh*_*dad 28 .net c# enums flags bitflags

申请[Flags]真正做什么?

我知道它会改变行为Enum.ToString,但它会做什么吗?(例如,不同的编译器或运行时行为等)


编辑:是的,我知道它记录了枚举旨在用作按位标志的事实,并且将它应用于位标志更合乎逻辑.我更多地询问具体的行为变化,而不是一般的编程实践.

dev*_*vio 28

来自MSDN文章:

值得注意的是,当指定Flags时,Parse和Format方法具有高级功能.

同样,Parse方法可以成功地将逗号分隔的字符串解析为刚才显示的正确数值.


Dav*_*ler 16

见大卫·基恩的帖子在这里.这似乎是一个语言互操作问题:

虽然C#很乐意允许用户在没有FlagsAttribute的情况下对枚举执行位操作,但Visual Basic却没有.因此,如果您将类型公开给其他语言,那么使用FlagsAttribute标记枚举是一个好主意; 它还清楚地表明枚举的成员被设计为一起使用.

问候

大卫


Bri*_*Kay 6

以下列出了具体的行为差异:

  • 将[flags]设置为None将枚举清除所有标志.
  • HasFlags方法仅在存在此属性时才有效.
  • 正如Devio所说,它改变了Parse和Format方法的功能.他链接到这篇文章.显然,它也会影响调试器中显示的内容.
  • 我认为[flags]可能对webservices中的代码生成产生了影响,但似乎并非如此.
  • 要清楚,任何枚举都允许按位操作,有或没有[flags].但使用它是最好的做法.

更多细节:http://msdn.microsoft.com/en-us/library/ms229062.aspx

  • 即使没有指定`Flags`,我也不能这样做吗? (2认同)

HCL*_*HCL 5

如果你问它在幕后做了什么,据我所知,它改变了ToString()方法,没有别的.

在.Net 4下,你有HasFlags -method来检查特定的标志.如果我正确解释msdn,你必须使用flags-attribute来使用这个方法.但我没试过.