应用[Flags]
真正做了什么?
我知道它会修改Enum.ToString
的行为,但它会做什么吗? (例如,不同的编译器或运行时行为等)
编辑:是的,我知道文件枚举旨在用作按位标志的事实,并且应用它更合乎逻辑位标志。我更多地询问具体的行为变化,而不是一般的编程实践。
答案 0 :(得分:28)
来自MSDN article:
值得注意的是,何时 标志是指定的,Parse和Format 方法具有高级功能。
同样,Parse方法可以 成功解析逗号分隔 字符串就像刚才显示的一样 正确的数值。
答案 1 :(得分:16)
见David M. Kean的帖子here。这似乎是一个语言互操作问题:
虽然C#很乐意允许用户在没有FlagsAttribute的情况下对枚举执行位操作,但Visual Basic却没有。因此,如果您将类型公开给其他语言,那么使用FlagsAttribute标记枚举是一个好主意;它还清楚地表明枚举的成员被设计为一起使用。
此致
大卫
答案 2 :(得分:6)
以下列出了具体的行为差异:
答案 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#可以追溯到该编号以查找所有被标记的内容。