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

时间:2011-05-05 19:18:18

标签: c# .net enums flags bitflags

应用[Flags]真正做了什么?

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


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

6 个答案:

答案 0 :(得分:28)

来自MSDN article

  

值得注意的是,何时   标志是指定的,Parse和Format   方法具有高级功能。

     

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

答案 1 :(得分:16)

见David M. Kean的帖子here。这似乎是一个语言互操作问题:

  

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

     

此致

     

大卫

答案 2 :(得分:6)

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

  • 将[flags]设置为“无”清除所有标志。
  • HasFlags方法仅在此属性存在时才有效。
  • 正如Devio所说,它改变了Parse和Format方法的功能。他与this article相关联。显然它也会影响调试器中显示的内容。
  • 我认为[flags]可能会对webservices中的代码生成产生影响,但是it appears that this is not the case.
  • 要清楚,任何枚举都允许按位操作,有或没有[flags]。但使用它是最好的做法。

更多详情:http://msdn.microsoft.com/en-us/library/ms229062.aspx

答案 3 :(得分:5)

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

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

答案 4 :(得分:1)

在实践中,我使用的一个用途是指示多种状态。这是对评估测试结果的一些代码的简化。测试可以是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不合逻辑,但我只是确保这不是我使用枚举的情况。

答案 5 :(得分:0)

标志提供了将枚举用于多个值的选项。

考虑一种情况,您希望针对不同的情况使用复选框,但又不想在数据库中创建不同的列。如果您有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#可以追溯到该编号以查找所有被标记的内容。