声明如何同时具有=和==?

时间:2012-05-18 20:34:15

标签: c# .net visual-studio-2010 operators

我找到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为真,但任何人都可以解释原因吗?

6 个答案:

答案 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
如果任何标记foobarbaz为真,则

qux成立。您可以评估右值中的任何表达式。

答案 3 :(得分:3)

=是赋值运算符,它设置isDir

的值

==是一个比较运算符,正在检查两边的值是否相等

答案 4 :(得分:2)

==是一个在C#中返回布尔值的运算符。 isDir被分配了该运算符的结果。这不仅限于C#,但并不一定是所有.net语言共有的(例如,据我所知VB .net仍然使用单个等于进行相等测试)。

答案 5 :(得分:1)

此语句获取文件路径的属性(带有标志枚举)并使用目录的枚举值进行AND运算(这实质上将枚举的所有位擦除为0,但代表{{1}的除外然后它比较该操作的结果,看它是否实际上等于表示FileAttributes.Directory的枚举值。然后该操作的结果存储在isDir变量中。

此代码相当于:

FileAttributes.Directory

有关标记枚举如何工作的更多信息(FileAttributes是什么),请参阅: Enums