7

列挙型がC#でどのように機能するかを理解し、Flags属性がテーブルにもたらすものを取得します。

私はここでこの質問を見ました。これは最初のフレーバーを推奨しますが、その理由/正当化を提供しません。

これら2つの定義方法に違いはありますか?一方が他方より優れていますか?2番目の代わりに最初のシナックスを使用する利点は何ですか?Flagsタイプの列挙型を定義するときは常に2番目のフレーバーを使用していました...これまでずっと間違っていましたか?

[Serializable]
[Flags]
public enum SiteRoles
{
    User = 1 << 0,
    Admin = 1 << 1,
    Helpdesk = 1 << 2
}

それはと同じではありませんか

[Serializable]
[Flags]
public enum SiteRoles
{
    User = 1,
    Admin = 2,
    Helpdesk = 4
}
4

3 に答える 3

6

最初のフラグの主な利点は、コンパイラが自動的に行うため、各フラグの正しい値を計算する必要がないことです。それを除けば、それらは同じです。

于 2010-01-25T17:36:07.153 に答える
6

より複雑なサンプルを検討してください。

[Flags]
public enum SiteRoles
{
    User = 1 << 12,
    Admin = 1 << 13,
    Helpdesk = 1 << 15,
    AdvancedUser = User | Helpdesk, //or (1<<12)|(1<<13)
}

[Flags]
public enum SiteRoles
{
    User = 4096, //not so obvious!
    Admin = 8192,
    Helpdesk = 16384,
    AdvancedUser = 12288, //!
}

[Flags]
public enum SiteRoles
{
    User = 0x1000, //we can use hexademical digits
    Admin = 0x2000,
    Helpdesk = 0x4000,
    AdvancedUser = 0x3000, //it much simpler calculate binary operator OR with hexademicals
}

このサンプルは、この場合、最初のバージョンがはるかに読みやすいことを示しています。10進リテラルは、フラグ定数を表すための最良の方法ではありません。また、ビット演算(フラグ定数を表すためにも使用できます)の詳細については、http://en.wikipedia.org/wiki/Bitwise_operationを参照してください。

于 2010-01-25T18:54:36.147 に答える
0

その読みやすさの議論をAFAIK。'<<'の右側にフラグの実際のインデックスがあるため、最初の方が読みやすいと言う人もいます。

于 2010-01-25T17:34:31.317 に答える