6

私はファイルとディレクトリに関するこの他のスタックオーバーフローの質問を見つけました、そして答えはこのステートメントを含んでいました:

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

彼の質問は.netに関するもので、私はVisual StudioのC#.netでコーディングしていました。同じステートメントで代入演算子と等号演算子の両方を持つ機能は、すべての.net言語で機能しますか、それとも特定の言語に固有ですか?また、上記のコードがどのように機能するかについての説明を得ることができますか?それがディレクトリを参照していると仮定するとpath、私はisDir真実であると期待しますが、誰かがその理由を説明できますか?

4

6 に答える 6

13

演算子によって実行される等価性テストは、==演算子によって実行される代入よりも優先され=ます。したがって、isDir変数はtrue、演算子の両側==が等しい場合に等しく設定され、そうでない場合は に設定されfalseます。つまり、次のように言うのと同じです。

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

これは VB.NET で可能です。他の言語についてはお答えできません。VB.NET では、次のようになります。

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

VB は=代入演算子と等価テスト演算子の両方に同じ文字 ( ) を使用するため、コンテキストに基づいてどちらの操作を実行しているかを判断します。=VB コンパイラは、最初の演算子が割り当てであり、2 番目の演算子が等価性テストであることを認識できるほどスマートです。ただし、これは明らかに紛らわしいため、読みやすさのために推奨されないことがよくあります。他の言語のバックグラウンドを持つ人々にとっては特に混乱を招きます。たとえば、C# では、次のようにして 2 つの変数を同じ値に設定できます。

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

C# で発生する理由は、=が常に代入演算子であり、代入式が常に代入された値に評価される (返される) ためです。したがって、この場合、式y = 5は値 5 を変数yに代入するだけでなく、値 5 にも評価されます。したがって、xその式の値を設定すると、5 にも設定されます。ただし、VB では、結果は大きく異なります。

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

VB では、コンパイラは式が等値テストであると想定するy = 5ため、 に評価されFalseます。したがって、x = Falseの値に応じて、どちらが機能するか、または機能しないかを設定しようとしますOption Strict

于 2012-05-18T20:37:10.510 に答える
6

上記のコードがどのように機能するかを次に示します。右側は単純に true または false に評価されるため、等価 (==) 演算子です。その値は、代入 (=) 演算子を使用して設定されます。

両方の演算子が使用されている別の例 (違いはありますが) は、ファイル IO にあります。

while((line = streamReader.ReadLine()) != null)
{
   //do file IO
}
于 2012-05-18T20:37:11.767 に答える
5

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

言ってるのと同じだ

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

しかし、より簡潔です。

同じステートメント内の代入と等価の特殊なケースではありません。次のようなことができます

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

fooフラグbarbaz、またはのいずれかが true の場合に true になりquxます。右辺値で任意の式を評価できます。

于 2012-05-18T20:37:59.143 に答える
3

=isDir の値を設定する代入演算子です。

==は比較演算子で、両側の値が等しいかどうかをチェックしています

于 2012-05-18T20:37:17.760 に答える
2

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

于 2012-05-18T20:37:06.400 に答える
1

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

このコードは次と同等です。

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

フラグ列挙型の仕組み ( FileAttributesとは何か) の詳細については、列挙型を参照してください。

于 2012-05-18T20:41:19.080 に答える