10

flags 属性と bitwize 演算子を使用して enum をビット フラグとして使用する方法を検討していました (以下を参照)。

このパターンが使用されている .NET フレームワークの場所はありますか? 私はこれが好きですが、もっと実際の例を見たいです

[Flags]
enum Days2 : int
{

  None = 0x0,
  Sunday = 0x1,
  Monday = 0x2,
  Tuesday = 0x4,
  Wednesday = 0x8,
  Thursday = 0x10,
  Friday = 0x20,
  Saturday = 0x40
}

  Days2 meetingDays = Days2.Tuesday | Days2.Thursday;

  // Set an additional flag using bitwise OR.
  meetingDays = meetingDays | Days2.Friday;

  Console.WriteLine("Meeting days are {0}", meetingDays);
4

6 に答える 6

11

はい -MethodBase.Attributesたとえば、メンバーが public か static かなどを見てください。

FileAccessFileOptionsファイルベースの例でもあります。

リフレクターを開き、「分析」(Ctrl-R) を見つけFlagsAttributeてヒットし、「使用者」を展開すると、それを使用しているタイプがたくさん表示されます。ただし、しばらく時間がかかります:)

于 2010-08-10T12:24:05.343 に答える
5

最も一般的な [Flags] 列挙型の 1 つは、regex options 列挙型です。次に例を示します。

Regex rxInsensitive = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b",
          RegexOptions.Compiled | RegexOptions.IgnoreCase);

詳細はこちら: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

何年も前に、.Net でのビット列挙型の使用に関するチュートリアルを書きました

于 2010-08-10T12:27:51.767 に答える
2

mscorlibおよびSystemアセンブリには多くの例がありますが、日常の使用でいくつ遭遇するかは難しい質問です。

たとえば、System.Threading.ThreadStateは、現在のスレッドステータスと保留中のリクエストの組み合わせです。

私は実際に、システムとmscorlibのすべてのフラグ列挙型を、笑いのためだけにダンプしてから、興味深いものを探しに行きました。

    Dim types = (From t In Reflection.Assembly.GetAssembly(GetType(Int32)).GetTypes() Select t).Concat( _
                (From t In Reflection.Assembly.GetAssembly(GetType(Uri)).GetTypes() Select t))

    For Each t As Type In types
        If t.IsEnum AndAlso (From att In t.GetCustomAttributes(True) Where TypeOf (att) Is FlagsAttribute).Any() Then
            Console.WriteLine("Flag Enum: {0}", t.ToString())
        End If
    Next
    Console.ReadLine()
于 2010-08-10T12:33:48.217 に答える
2

FlagsAttributeがBCL の列挙に使用される場所はたくさんあります。

ここに一例があります -BindingFlagsリフレクション コードで使用されるパラメータです。

于 2010-08-10T12:24:11.170 に答える
2

使用される場所はたくさんあります。ファイル属性の .NET フレームワークで使用されます。セキュリティ フラグとして使用されるのを見てきました。

enum Roles
{
    None = 0,
    User = 1,
    Admin = 2,
    Superman = 4
}

if (_user.Roles & Roles.Admin != Roles.None) { user-is-admin }
if (_user.Roles & Roles.Superman != Roles.None) { user-is-also-superman }

これらは基本的に、色の選択や民族性の選択などの可能性のあるものがある場合、何かの可能な属性を選択できるシナリオに最適です。

それらを表示するもう1つの一般的な場所は、winformダイアログがそれらで構成された属性を持っていることです。メッセージボックスのために一緒にまたはそれらをまとめて、Ok |のように取得するボタンの選択を決定できます。キャンセル | 無視等。

于 2010-08-10T12:26:42.173 に答える
2

次のようなフォントスタイルオプションを設定する場合はどうですか:

this.Font = new Font(this.Font, FontStyle.Bold | FontStyle.Italic);
于 2010-08-10T12:38:18.863 に答える