属性真的有什么作用?

应用[Flags]真的有什么作用?

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


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

来自MSDN文章 :

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

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

请参阅David M. Kean的post。 这似乎是一个语言互操作问题:

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

问候

大卫

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

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

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

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

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

在实践中,我使用的一个用途是指示多种状态。 这是对评估测试结果的一些代码的简化。 测试可以是Ok,或者可能有几个原因没有Ok。 这给我的优点是,我有一个方法来评估测试“Ok-ness”,并且该方法能够通过一次返回指示所有可能的故障条件。 可能不是最好的设计,但它适用于这种情况。

 [Flags] public enum ResultStatusEnum { Ok = 0x1, SampleInvalid = 0x2, DirectionInvalid = 0x4, TestIsNotValid = 0x8 } 

你这样设置:

 ResultStatusEnum res = ResultStatusEnum.SampleInvalid | ResultStatusEnum.DirectionInvalid; 

缺点是检查枚举的值变得麻烦。 这不会(必然)起作用:

 res == ResultStatusEnum.Ok 

你必须这样做来检查:

 ResultStatusEnum.SampleInvalid == (res & ResultStatusEnum.SampleInvalid) 

在这种情况下,它具有ResultStatusEnum.Ok & ResultStatusEnum.SampleInvalid不合逻辑,但我只是确保这不是我使用枚举的情况。

标志提供了使用枚举多值的选项。

考虑一种情况,您希望在不同情况下使用Checkbox,但不希望在数据库中创建不同的列。 如果您有20个复选框,则必须使用bool在数据库中创建20列。 但是使用标志,您可以创建一个列并使用该值存储在列中。 在控制台中运行此示例以更好地理解它。

 class Program { static void Main(string[] args) { //Set the features that you require for car. Consider it as checked in the UI. CarFeatures carFeatures = CarFeatures.AC | CarFeatures.Autopilot| CarFeatures.Sunroof; //Do the backend logic if (carFeatures.HasFlag(CarFeatures.Autopilot)) { //Show Autopilot cars } //See the what carfeatures are required Console.WriteLine(carFeatures); //See the integer value of the carfeatures Console.WriteLine((int)carFeatures); Console.ReadLine(); } } [Flags] public enum CarFeatures { AC=1, HeatedSeats= 2, Sunroof= 4, Autopilot= 8, } 

不同的组合总是为您提供一个唯一的数字,c#跟踪回来查找所有标记的内容。