2015-09-07 7 views
5

は、私は次のコードを参照してください。if((attributes&FileAttributes.Hidden)== FileAttributes.Hidden){}はどのように動作しますか? <a href="https://msdn.microsoft.com/en-us/library/system.io.file.getattributes(v=vs.110).aspx" rel="nofollow">this</a>ページで

if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden) 

をしかし、それはそれは方法である理由私はを理解していません。

なぜattributes & FileAttributes.Hidden)attributesの特異点検は実際に何をしていますか? nullでないかどうかチェックしますか?私は知っていると感じているが、それは変だと思う。ランダムで奇妙な。

+3

代わりにEnum.HasFlag(https://msdn.microsoft.com/en-us/library/system.enum.hasflag%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)を使用してください。 – Andrew

+2

[FileAttributes](https://msdn.microsoft.com/en-us/library/system.io.fileattributes(v = vs.110).aspx)ページも参照してください。タイプにFlagsAttribute属性があると、値が一連の値ではなく論理フラグのコレクションとして扱われることを意味します。つまり、論理AND( '&')とOR( '|')演算子を使用してフラグフィールドをチェックします。 –

+1

同様の質問に対するこの回答を参照してください。非常によく書かれたIMO。 http://stackoverflow.com/a/1769814/1260204 – Igor

答えて

15

単純なブール論理です。 ==演算子は、両辺がまったく同じ値を持つ場合にのみ、trueを返します。だからあなたはマスクattributes値と比較したいと思うフラグがあります。 (値が構成されている)、これら2つの例を考える:

真:

0010001 // attributes 
& 0000001 // FileAttributes.Hidden 
    ------- 
= 0000001 // FileAttributes.Hidden 

偽:

0011000 // attributes 
& 0000001 // FileAttributes.Hidden 
    ------- 
= 0000000 // FileAttributes.None 
3

&は、ビット単位のAND演算子です。

この演算子は、ビット単位でANDと2組のビットを実行するだけです。 (|)とXOR(排他的OR)(^)演算子

0 & 0 === 0 
1 & 0 === 0 
0 & 1 === 0 
1 & 1 === 1 

とオペレータに続いて、また、ORが存在します。

+1

^はXOR演算子です。〜はNOTです。 XORは、 "1であるが両方のビットが1でない場合は1"を意味し、NOTは両方のビットが0である場合に "1"を意味する。 – Kevin

4

attributesは、FileAttributesタイプです。このタイプは、値タイプのenumです。 FileAttributes?Nullable<FileAttributes>)ではないので、単ににすることはできません。

すべてenumは名前付きの値のリストで構成されていますが、それぞれはある整数(int)の値にマッピング/変換可能です。多くの場合、C#ではその変換を「悪用する」ことができ、列挙型の値をint型と同じように扱うことができますが、そうではありません。

たとえば、&演算子は、期待していた操作を実行します。これは、バイナリANDを実行します。このようにして、整数に変換されたenum値に関連するビットが設定されている場合は、非ゼロの結果が得られます。

いくつかのステータス値にいくつかのフラグ/ビットが存在するかどうかを確認する "良い方法"です。フラグが設定されているかどうかを確認するfoo & FLAG != 0のような表現がよく見られるかもしれません。そうでない場合は、foo & (FLAG|BLAG) != 0がチェックされます。誰かがFLAGに複数のビットを持つように変更した場合、そのような式はANYビットがセットされているかどうかをチェックし、そのような "マルチビットフラグ"がセットされていないかどうかをチェックするため、少し欠陥がある/危険です。そのため、ビットマスクを適用し、結果がビットマスクであるかどうかをチェックするfoo & FLAG == FLAGがよく見られるため、マスクのすべてのビットが設定されているかどうかを確認します。

あなたの場合は、それだけです。その式では、ANDingと同じマスクで比較しているので、マスクのすべてのビットが設定されているかどうかを効果的にチェックしています。しかし、FileAttributesが明確に[Flags]とマークされているので余計ですが、Hiddenの値はちょうど1ビットなので、!= 0で十分です。

しかし、このような場合(チェックフラグ、ない空想のビット単位のマスク)であなたはそれがこのような場合に設計されていますので、ほとんどの人は、それを使用することをアドバイスします、Enum.HasFlagメソッドを使用しようとするかもしれない;)

このしかし、常にベストピックではありません。参照してください:そのパフォーマンスコストがあなたに問題になる場合、私は驚いされるだろう..but

。この時点まで最適化することは非常にまれです。

関連する問題

 関連する問題