为什么MSDN声明HasFlag被设计*与FlagsAttribute一起使用?

时间:2014-01-07 12:32:10

标签: c# .net enums msdn enum-flags

问题 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);
}

那么,为什么它实际上说它设计*与FlagsAttribute一起工作,而实际上它并不依赖它?

1 个答案:

答案 0 :(得分:1)

HasFlags仅对Flags枚举有意义。您不必将枚举声明为Flags,但建议您这样做。它是文档,它可以标记ToString格式。

MSDN建议您 创建标记枚举,标记为Flags并使用HasFlags不执行任何操作。不要混。

这就是所有这句话都试图传达的。它会推动您进行最佳实践。理想情况下,会有一个指向解释标志的页面的链接,但这不是MSDN通常的处理方式(唉)。他们主要告诉你你能做什么,而不是你应该做什么。