3

質問[Flags] Enum 属性は C# で何を意味しますか? 私が何を求めているのか尋ねず、それに答えません。その質問にそのような答えがある場合は、無意識に誤って重複としてフラグを立てるのではなく、コメントにどれ(リンク)かを記載してください。


MSDN のHasFlagドキュメントに次のメモがあります。

HasFlag メソッドは、FlagsAttribute 属性でマークされた列挙型で使用するように設計されており、複数のビット フィールドが設定されているかどうかを判断するために使用できます。FlagsAttribute 属性でマークされていない列挙型の場合は、Equals メソッドまたは CompareTo メソッドを呼び出します。

しかし、私はそれをテストしましたが、列挙型がFlagsAttributeでマークされているかどうかにかかわらず、メソッドは正常に機能しました。

たぶん、ドキュメントのメモは、属性を使用してある種の*良い慣行*を強制する試みにすぎません(そして、それは最終的にはまったく問題ではありません)?


私はここをのぞき見しましたが、実際には、列挙型にはまったく制限がないようです (単純なビットごとの 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 に依存していないのに、一体なぜ FlagsAttribute で動作するように設計されていると言っているのですか?

4

1 に答える 1

1

HasFlagsFlags列挙型でのみ意味があります。列挙型を as として宣言する必要はありませんが、Flags推奨されます。これはドキュメントであり、フラグのToString書式設定を調整します。

MSDN では、フラグ列挙型を作成するFlags、それをマークして使用するかHasFlagsまたは何もしないことをお勧めします。混ぜるな。

この文が伝えようとしているのはそれだけです。それはあなたをベストプラクティスに駆り立てます。理想的には、フラグを説明するページへのリンクがあるはずですが、それは MSDN の通常の処理方法ではありません (残念ながら)。彼らはたいてい、何をすべきかではなく、何ができるかを教えてくれます。

于 2014-01-10T17:44:53.577 に答える