我找到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
为真,但任何人都可以解释原因吗?
答案 0 :(得分: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编译器非常聪明,知道第一个=
运算符是赋值,第二个运算符是相等性测试。然而,这显然令人困惑,因此为了便于阅读,通常不鼓励这样做。对于具有其他语言背景的人来说,这尤其令人困惑。例如,在C#中,您可以执行以下操作将两个变量设置为相同的值:
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
哪些可能有效或无效。
答案 1 :(得分:6)
以上是上述代码的工作原理。右侧简单地评估为true或false,因此等价(==)运算符。然后使用赋值(=)运算符设置该值。
使用两个运算符的另一个示例(尽管不同)位于文件IO中:
while((line = streamReader.ReadLine()) != null)
{
//do file IO
}
答案 2 :(得分: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
,bar
或baz
为真,则 qux
成立。您可以评估右值中的任何表达式。
答案 3 :(得分:3)
=
是赋值运算符,它设置isDir
==
是一个比较运算符,正在检查两边的值是否相等
答案 4 :(得分:2)
==
是一个在C#中返回布尔值的运算符。 isDir
被分配了该运算符的结果。这不仅限于C#,但并不一定是所有.net语言共有的(例如,据我所知VB .net仍然使用单个等于进行相等测试)。
答案 5 :(得分:1)
此语句获取文件路径的属性(带有标志枚举)并使用目录的枚举值进行AND运算(这实质上将枚举的所有位擦除为0,但代表{{1}的除外然后它比较该操作的结果,看它是否实际上等于表示FileAttributes.Directory
的枚举值。然后该操作的结果存储在isDir变量中。
此代码相当于:
FileAttributes.Directory
有关标记枚举如何工作的更多信息(FileAttributes是什么),请参阅: Enums