应用 [Flags]
到枚举类型有什么实际作用?
我知道它会修改 Enum.ToString
的行为,但除此之外还有其他作用吗?(例如:不同的编译器或运行时行为等)
编辑: 是的,我知道它 文档化了 枚举类型是用于按位标志的事实,并且将其应用于位标志更具逻辑性。我更想了解的是具体的行为变化,而不是一般的编程实践。
应用 [Flags]
到枚举类型有什么实际作用?
我知道它会修改 Enum.ToString
的行为,但除此之外还有其他作用吗?(例如:不同的编译器或运行时行为等)
编辑: 是的,我知道它 文档化了 枚举类型是用于按位标志的事实,并且将其应用于位标志更具逻辑性。我更想了解的是具体的行为变化,而不是一般的编程实践。
根据MSDN文章的内容:
值得注意的是,当指定标志时,Parse和Format方法具有高级功能。
同样,Parse方法可以成功地将像刚才展示的逗号分隔字符串解析为正确的数值。
Parse
的行为... - user541686如果你问它在底层做了什么,据我所知,它只改变了ToString()方法,没有其他操作。
.Net 4下有HasFlags方法来检查特定的标志。如果我正确理解MSDN,你需要使用flags属性才能使用此方法。但我没有尝试过。
[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
是不合逻辑的,但我只是确保我没有在枚举中使用这种情况。Flags 提供了使用枚举类型存储多个值的选项。
考虑这样一种情况:您想要在不同的场景中使用复选框,但不想在数据库中创建不同的列。如果您有 20 个复选框,则必须创建 20 个带有布尔值的列。但是使用 flags,您可以创建一个列,并使用该值将其存储在该列中。在控制台中运行此示例以更好地理解它。
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#会跟踪这个数字以找到所有被标记的内容。