私のコードによると、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]
上記の意味は何ですか?
私のコードによると、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]
上記の意味は何ですか?
列挙型の値を指定できます。これは、フラグの場合に必要です。
[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 を使用しても文句を言いません (私へのニュース)。
Flags 属性は、列挙をビット フィールドとして扱うことができることを示します。つまり、一連のフラグです。
Flags 属性は、列挙型の ToString()、Parse()、および IsDefined() メソッドの動作/出力にのみ影響します。
2 の累乗値を使用する限り、Flags 属性を使用せずにビット演算を実行できます。
詳細については、この既存の質問(および回答) を参照してください。
[Flags]
コンパイラが各識別子に値を割り当てる方法は変更されません。列挙型にフラグが含まれているかどうかに関係なく、各値が適切であることを確認するのは常にユーザーの責任です。
また、コンパイラが列挙型で許可するビット単位の操作も変更しません。
それが行うことは、Enum.Parse
およびEnum.ToString
メソッドの動作を変更して、値の組み合わせと単一の値をサポートすることです"a, b, c"
。