2016-06-21 5 views
1

ので、私はC#に新しいですし、私の人生のために私は(レガシープロジェクトから)正確に以下のコードが行うことになっているものを理解することはできません。フラグと<<列挙型の操作? [OK]をC#の

[Flags] 
public enum EAccountStatus 
{ 
    None = 0, 
    FreeServiceApproved = 1 << 0, 
    GovernmentAccount = 1 << 1, 
    PrivateOrganisationAccount = 1 << 2, 
    All = 8 
} 

<<オペレータが正確に何をするのかここでenums?なぜ私たちはこれが必要なのですか?

+0

pmgの回答を確認してください:http://stackoverflow.com/questions/3999922/why-use-the-bitwise-shift-operat or-c-en-enum-definitionの値のために – manish

+0

なぜ 'All = 1 << 3'を使わなかったのだろうか? –

+0

ありがとうございます@マニッシュ、そこにも華麗な答えです:) –

答えて

4

、列挙は実際にはintです。
<<このコードを書くのと等価な方法があるBitwise Left Shift Operator
です:MSDNで述べたように、この列挙はFlag attribute

を持っていることに、注意してください

[Flags] 
public enum EAccountStatus 
{ 
    None = 0, 
    FreeServiceApproved = 1, 
    GovernmentAccount = 2, 
    PrivateOrganisationAccount = 4, 
    All = 8 
} 

使用 ビット単位の操作(AND、OR、EXCLUSIVE OR)をpにする場合にのみ列挙のFlagsAttributeカスタム属性数値の場合は です。等価である

var combined = EAccountStatus.FreeServiceApproved | EAccountStatus.GovernmentAccount 

00000001 // =1 - FreeServiceApproved 
| 00000010 // =2 - GovernmentAccount 
--------- 
    00000011 //= 3 - FreeServiceApproved and GovernmentAccount 

this SO threadflags attribute

についてかなり良い説明を持っているあなたは複数のオプションを持つようにしたい場合は

この方法では、あなたが使用できる設定します

+0

ありがとう、Avi、それはきれいに説明されました:) –

+0

:)私は助けになることができてうれしいです。 –

2

<<は単純に何をしているのですか。シフトを左に移動します。舞台裏

限りwhy in an enumに関しては、式を評価したそのわずかな方法の列挙型は、(と、コンパイル時にそれらを評価する)式を許可するよう

+0

ありがとう、なぜですか?なぜシフトがenum上で操作を残したのですか? –

+0

@JoelMinこれは1,2,4を計算する簡単な方法であるからです。 '[Flags]'を使うときは、1ビットだけを設定します。 '1 << 0'を実行すると、第0ビットだけがセットされ、' 1 << 2'を実行すると2番目のビットだけがセットされます。 –

+0

@ScottChamberlainはとてもうまく説明しました。あなたは今それを理解することを願っています! –

関連する問題