2012-05-18 10 views
6

私はthis other stack overflow question about files and directoriesを発見した、との答えがこの文を含ま:ステートメントは=と==の両方を持つことができますか?

bool isDir = (File.GetAttributes(path) & FileAttributes.Directory) 
      == FileAttributes.Directory; 

彼の質問には、.NETについてだった、と私は、Visual StudioでC#.NETでコーディングされました。同じステートメント内の代入演算子と等価演算子の両方を持つ能力は、すべての.net言語で機能するのか、それとも特定のものに固有なのでしょうか?また、上記のコードがどのように機能するかについての説明を得ることができますか? pathがディレクトリを指しているとすれば、私はisDirが真であると思っていますが、なぜ誰でも説明できるのでしょうか?

+2

確かに、あなたは 'boolean numberEqualsFive = num == 5'のようなコードを書いていますか?いいえ。 –

+1

[評価の優先順位と順序](http://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx)と[ここでは特にC#]のコンテキスト(http://msdn.microsoft.com /en-us/library/aa691323(v=vs.71).aspx) –

+0

このコードは、 'File.GetAttributes'の結果がバイナリフラグビット' FileAttributes.Directory'を含んでいるかどうかをチェックします。 –

答えて

13

==演算子によって実行される等価性テストは、=演算子によって実行される割り当てよりも優先されます。したがって、==演算子の2つの辺が等しい場合、変数はtrueに等しく設定されます。そうでない場合はfalseに設定されます。言い換えれば、それは次のようになります:

if ((File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory) 
    isDir = true; 
else 
    isDir = false; 

これはVB.NETで可能です。私は他の言語には答えられません。 VB.NETでは、同等のは次のようになります。VBはそれが代入と平等・テスト演算子だの両方に同じ文字(=)を使用しているため

Dim isDir As Boolean = ((File.GetAttributes(path) And FileAttributes.Directory) = FileAttributes.Directory) 

、それはあなたがコンテキストに基づいて実行される操作を決定します。 VBコンパイラは、最初の=演算子が代入であり、2番目の演算子が等価テストであることを知るには十分にスマートです。しかし、これは明らかに紛らわしいので、読みやすいようにしばしばお勧めしません。特に、他の言語の背景を持つ人々にとっては混乱します。 =は常に代入演算子、および代入式は常に(と評価されたため、C#で起こる理由は

int y; 
int x = y = 5; // Both x and y will be set to 5 

:たとえば、C#では、あなたは同じ値に2つの変数を設定するには、次の操作を行うことができ割り当てられた値を返します。したがって、この場合、式y = 5は変数yに値5を割り当てるだけでなく、値5も評価します。したがって、xをその式の値に設定すると、同様に5に設定されます。 VBでは、しかし、結果は非常に異なっている:それはFalseと評価されますので、

Dim y As Integer 
Dim x As Integer = y = 5 

はVBでは、コンパイラは、表現y = 5は平等のテストであることを前提としています。したがって、Option Strictの値に応じて動作する場合と動作しない場合があります。x = Falseを設定しようとします。

2

==は、C#でブール値を返す演算子です。 isDirには、その演算子の結果が割り当てられています。これはC#に限定されているわけではありませんが、必ずしもすべての.net言語に共通するわけではありません(たとえば、VB.netが同等性テストに単一の等価を使用していることがわかっている限り)。

6

上記のコードの仕組みは次のとおりです。右辺は単純に真または偽であるため、等価(==)演算子を評価します。その値は、代入(=)演算子を使用して設定されます。

両方の演算子は(異なるが)使用されているもう一つの例は、ファイルIOである:

while((line = streamReader.ReadLine()) != null) 
{ 
    //do file IO 
} 
+1

意味的に同等の例ではありません。 OPの例は、ブール式の結果を変数に代入します。あなたの例では代入が行われ、割り当てられた値がnullに対してテストされます。 –

+1

合意し、OPはそれに注意する必要があります。私は、これらのオペレータの両方が1か所で使用される別のシナリオをOPに見せてもらうことができないと考えました。 – kmarks2

+0

おそらくそれは正確ではないが、OPは割り当てと比較演算子の両方を持つステートメントについて尋ねた。それは確かに関連する例です。 –

3

=がisDir

==の値を設定して、assigment演算子で比較したものですどちらかの側の値が等しいかどうかを確認しています。

5

割り当てが行われる前に評価値が評価されます。右辺値は等価比較です。比較の結果はtrueまたはfalseのブール値であり、当然ブール値に割り当てることができます。

それは

if((File.GetAttributes(path) & FileAttributes.Directory) 
      == FileAttributes.Directory) 
{ 
    isDir = true; 
} 
else 
{ 
    isDir = false; 
} 

を言うと同じだが、より簡潔です。

同じステートメントでは、割り当てと平等の特殊なケースはありません。あなたは、フラグbarbaz、またはquxのいずれかに該当する場合

bool bar, baz, qux; 
bar = qux = false; 
baz = true; 
bool foo = (bar || baz || qux); // foo is true 

fooがtrueになる

ような何かを行うことができます。右辺値の任意の式を評価できます。

1

この文はファイルパスの属性を取得しています(withフラグ付き列挙型)。これはディレクトリの列挙型の値とANDします(FileAttributes.Directoryを表すものを除いてenumのすべてのビットを0にします)。 。その演算の結果は、次にisDir変数に格納されFileAttributes.Directoryを表す列挙値に実際に等しいかどうかを確認するために、その操作の結果を比較

このコードは、と等価である:。

FileAttributes pathAttributes = File.GetAttributes(path); 
FileAttributes checkForDirectory = pathAttributes & File.GetAttributes(path); 
bool isDir = checkForDirectory == FileAttributes.Directory; 

フラグの列挙型がどのように機能するかについての詳細は、( Enums

関連する問題