这个C#运算符如何在此代码段中工作?

时间:2011-01-19 22:06:02

标签: c# syntax operators bit-manipulation bitwise-operators

我在SO上找到了这段代码片段(抱歉,我没有问题/答案组合的链接)

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

这让我感到困惑,因为FileAttributes.Directory的{​​{1}}位于==

&在这种情况下做了什么?我不知道如何阅读这行代码。我正在尝试评估路径字符串是文件还是目录。

10 个答案:

答案 0 :(得分:5)

它执行按位AND操作。属性存储为位标志,因此它和这些标志一起使用AttributeFlags.Directory来查看其中一个属性是.Directory。

Bit Flags的好例子: http://weblogs.asp.net/wim/archive/2004/04/07/109095.aspx

[Flags]
public enum FileAttributes
{
  Archive,        // 0000
  Compressed,     // 0001
  Device,         // 0010
  Directory,      // 0100
  Encrypted,       // 1000
  ...
}

然后:

 File.GetAttributes(source):  1101
 FileAttributes.Directory:    0100
 (Logical AND):               0100

0100与目录标志相同,因此我们现在知道该标志位于枚举的所选标志中。

答案 1 :(得分:5)

使用位掩码来测试是否设置了单个位(FileAttributes.Directory)。

枚举的值是2的幂,对应于各个位。

    ReadOnly = 1,
    Hidden = 2,
    System = 4,
    Directory = 16,
    Archive = 32,
    Device = 64,

如果设置了ReadOnly和Directory,则FileAttributes等于17.计算结果如下所示:

File.GetAttributes(source) = 00001001   
FileAttributes.Directory   = 00001000 &
-------------------------------------
                             00001000

如果目录位设置,则为零:

File.GetAttributes(source) = 00000001   
FileAttributes.Directory   = 00001000 &
-------------------------------------
                             00000000

一种稍微更简洁的方法来编写具有相同效果的表达式,即对零进行测试:

bool isDir = (File.GetAttributes(source) & FileAttributes.Directory) != 0;

答案 2 :(得分:2)

这是logical & operator。在此特定示例中,它检查FileAttributes枚举是否具有Directory值,验证source变量指向的字符串是否为目录。

答案 3 :(得分:1)

单身&是一个按位运算符。 http://msdn.microsoft.com/en-us/library/sbf85k1c(v=VS.100).aspx

它对两个值的各个位执行按位AND。它在位掩码中使用了很多。

答案 4 :(得分:1)

在这种情况下,

&是一个按位and运算符。

答案 5 :(得分:1)

它正在执行按位标记测试 - File.GetAttributes(source)可以返回指示不同属性的标志(在不同位中)的数字&1限制为 FileAttributes.Directory中存在的那些(我希望这是一个位)。实际上,这是16,即(二进制)..0001000

如果sourceReadOnly(= 1),Hidden(= 2)和Directory(= 16),则为:

...0001011

我们& 16岁

...0001000

离开

...0001000

因此目录测试传递

如果源代码有System(= 4)和ReadOnly(= 1)(而不是目录),那么它将是:

...0000101

我们& 16岁

...0001000

离开

...0000000

因此目录测试失败

作为旁注;此类测试中的==验证是否设置了所有所需的标志(如果多个位在第二个操作数中)。另一个常见的测试是!= 0,它测试是否存在任何位。

答案 6 :(得分:0)

它是按位运算符AND http://en.wikipedia.org/wiki/Bitwise_operation

codesnippet在两个变量之间执行按位AND,然后将该值与另一个变量进行比较,将结果放在一个bool中。

答案 7 :(得分:0)

按位AND操作。 FileAttributes是Flags enum。这意味着此枚举的数值中的每个位都描述了该文件的一些布尔属性,并且它们可以组合在一起。

答案 8 :(得分:0)

它正在测试FileAttributes.Directory返回的枚举中是否设置了标志File.GetAttributes。您可以在this entry on MSDN中详细了解如何使用标记枚举。

  

我正在尝试评估路径字符串是文件还是目录。

我宁愿使用System.IO中的一种方法,例如Directory.Exists

if (Directory.Exists(path))
{
    // it's a directory
} 
else if (File.Exists(path))
{
    // it's a file
}
else
{
   // doesn't exist
}

答案 9 :(得分:0)

GetAttributes返回一个标志值,其中每个位代表不同的布尔状态。此代码使用按位& operator,用于打开Directory标志,以及GetAttributes返回的任何其他标志。

这看起来过于复杂。这相当于写作:

bool isDir = File.GetAttributes(source).HasFlag(FileAttributes.Directory);

或者,专门测试Directory属性:

bool isDir = File.GetAttributes(source) == FileAttributes.Directory;

HasFlag()方法目前有点慢,因此按位替代方法更快,使用的资源更少。 HasFlag非常适合快速简单地响应标志中的所需位是打开还是关闭,而不知道位值或二进制文件。