3

问题[Flags] 枚举属性在 C# 中是什么意思? 不问我在问什么也不回答。如果该问题有这样的答案,请在评论中说明是哪一个(链接),而不是盲目和错误地标记为重复。


MSDN 的HasFlag文档中有此注释:

HasFlag 方法设计为与使用 FlagsAttribute 属性标记的枚举类型一起使用,并可用于确定是否设置了多个位字段。对于未使用 FlagsAttribute 特性标记的枚举类型,请调用 Equals 方法或 CompareTo 方法。

但是我已经对其进行了测试,尽管枚举被标记或没有标记,但该方法运行良好FlagsAttribute

也许文档上的注释只是试图通过使用属性来强制执行某种*好的做法*(最终根本无关紧要)?


我在这里看了一眼,确实似乎对枚举没有任何限制(它只是一个简单的按位与):

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 一起使用,而实际上它并不依赖它?

4

1 回答 1

1

HasFlagsFlags仅对枚举有意义。您不必声明枚举,Flags但建议这样做。它是文档,它调整标志ToString格式。

MSDN 建议您要么创建一个标志枚举,标记它Flags并使用HasFlags要么不这样做。不要混在一起。

这就是这句话试图传达的全部内容。它会促使您采用最佳实践。理想情况下,会有一个指向解释标志的页面的链接,但这不是 MSDN 通常处理的方式(唉)。他们大多告诉你你能做什么,而不是你应该做什么。

于 2014-01-10T17:44:53.577 回答