3

私のコードによると、a = 1、b = 2、c = 3など。フラグはa = 1、b = 2、c = 4などになると思いました

[Flags]
public enum someEnum { none, a, b, c, d, e, f, }

意図したものを取得するにはどうすればよいですか (c=4, e=8)? そして、[Flags]上記の意味は何ですか?

4

4 に答える 4

17

列挙型の値を指定できます。これは、フラグの場合に必要です。

[Flags]
enum MyFlags {
  Alpha=1,
  Beta=2,
  Gamma=4,
  Delta=8
}

上記の [Flags] は何を意味しますか?

これは、ランタイムが値に対するビット単位の操作をサポートすることを意味します。コンパイラが生成する値に違いはありません。たとえば、これを行う場合

var x = MyFlags.Alpha | MyFlags.Beta;

Flags 属性の結果x.ToString()は " Alpha, Beta" です。属性がない場合は 3 になります。また、解析動作も変更されます。

編集: より良い名前で更新され、コンパイラは、少なくとも C#3 または 4 ではなく、フラグ以外の属性でビットごとの ops を使用しても文句を言いません (私へのニュース)。

于 2009-08-26T08:11:38.663 に答える
1

Flags 属性は、列挙をビット フィールドとして扱うことができることを示します。つまり、一連のフラグです。

于 2009-08-26T08:11:14.903 に答える
1

Flags 属性は、列挙型の ToString()、Parse()、および IsDefined() メソッドの動作/出力にのみ影響します。

2 の累乗値を使用する限り、Flags 属性を使用せずにビット演算を実行できます。

詳細については、この既存の質問(および回答) を参照してください。

于 2009-08-26T08:20:58.817 に答える
0

[Flags]コンパイラが各識別子に値を割り当てる方法は変更されません。列挙型にフラグが含まれているかどうかに関係なく、各値が適切であることを確認するのは常にユーザーの責任です。

また、コンパイラが列挙型で許可するビット単位の操作も変更しません。

それが行うことは、Enum.ParseおよびEnum.ToStringメソッドの動作を変更して、値の組み合わせと単一の値をサポートすることです"a, b, c"

于 2009-08-26T08:20:09.083 に答える