问题 What does the [Flags] Enum Attribute mean in C#? 并不会问我要求的内容以及没有回答< / strong>即可。如果在这个问题中有这样的答案,请说明评论中的哪一个(链接),而不是盲目地,错误地标记为重复。
MSDN&#39; HasFlag文档中有这样的说明:
HasFlag方法设计用于使用FlagsAttribute属性标记的枚举类型,可用于确定是否设置了多个位字段。对于未使用FlagsAttribute属性标记的枚举类型,请调用Equals方法或CompareTo方法。
但是我已经对它进行了测试,尽管使用FlagsAttribute标记了枚举,但该方法仍然正常。
也许关于文档的注释只是尝试通过使用属性强制执行某种*良好实践*(最终根本不重要)?
我偷看了here,看起来确实对枚举没有任何限制(它只是一个简单的按位AND):
public Boolean HasFlag(Enum flag) {
if (!this.GetType().IsEquivalentTo(flag.GetType())) {
throw new ArgumentException(Environment.GetResourceString("Argument_EnumTypeDoesNotMatch", flag.GetType(), this.GetType()));
}
ulong uFlag = ToUInt64(flag.GetValue());
ulong uThis = ToUInt64(GetValue());
return ((uThis & uFlag) == uFlag);
}
答案 0 :(得分:1)
HasFlags
仅对Flags
枚举有意义。您不必将枚举声明为Flags
,但建议您这样做。它是文档,它可以标记ToString
格式。
MSDN建议您 创建标记枚举,标记为Flags
并使用HasFlags
,或不执行任何操作。不要混。
这就是所有这句话都试图传达的。它会推动您进行最佳实践。理想情况下,会有一个指向解释标志的页面的链接,但这不是MSDN通常的处理方式(唉)。他们主要告诉你你能做什么,而不是你应该做什么。