Как этот оператор C # работает в этом фрагменте кода? - PullRequest
5 голосов
/ 20 января 2011

Я нашел этот фрагмент кода на SO (извините, у меня нет ссылки на комбо вопрос / ответ)

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

Это смущает меня, потому что FileAttributes.Directory находится по обе стороны от ==.

Что делает & в этом случае? Я не уверен, как читать эту строку кода. Я пытаюсь оценить, является ли строка пути файлом или каталогом.

Ответы [ 10 ]

5 голосов
/ 20 января 2011

Используется битовая маска для проверки, установлен ли один бит (FileAttributes.Directory).

Значения перечисления представляют собой степени двух, соответствующие отдельным битам.

    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;
5 голосов
/ 20 января 2011

делает битовую операцию ИАтрибуты хранятся в виде битовых флагов, поэтому эти флаги можно объединить с AttributeFlags.Directory, чтобы узнать, является ли один из атрибутов .Directory.

Хороший пример битовых флагов здесь: 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 совпадает с флагом каталога, поэтому теперь мы знаем, чтоэтот флаг находится в выбранных флагах перечисления.

2 голосов
/ 20 января 2011

Это логический оператор .В этом конкретном примере он проверяет, имеет ли перечисление FileAttributes значение Directory, и проверяет, является ли строка, указанная в переменной source, каталогом.

1 голос
/ 20 января 2011

Выполняется проверка побитового флага - File.GetAttributes(source) может вернуть число флагов (в разных битах), указывающих различные свойства.& ограничивает 1 с только теми, которые присутствуют в FileAttributes.Directory (я бы ожидал, что это будет один бит).Как это бывает, это 16, то есть (двоичное) ..0001000

, если source имеет ReadOnly (= 1), Hidden (= 2) и Directory (=16) это будет:

...0001011

we & с 16

...0001000

, оставляя

...0001000

, следовательно, проверка каталога проходит .

Если вместо источника есть System (= 4) и ReadOnly (= 1) (а не каталог), это будет:

...0000101

we & с 16

...0001000

оставляя

...0000000

, следовательно, проверка каталога не проходит .

В качестве примечания;== в таком тесте подтверждает, что all требуемые флаги были установлены (если во втором операнде было несколько битов).Другим распространенным тестом является != 0, который проверяет наличие любых битов.

1 голос
/ 20 января 2011

& в этом случае является побитовым and оператором.

1 голос
/ 20 января 2011

Единичный & является побитовым оператором. http://msdn.microsoft.com/en-us/library/sbf85k1c(v=VS.100).aspx

Он выполняет побитовое И для отдельных битов для двух значений. Он часто используется в битовых масках.

0 голосов
/ 20 января 2011

GetAttributes возвращает значение флага, где каждый бит представляет свое логическое состояние. Этот код использует побитовый оператор &, чтобы включить флаг Справочника, в дополнение к любым другим флагам, возвращаемым GetAttributes.

Кажется, это было слишком сложно. Это эквивалентно написанию:

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

Или, чтобы проверить исключительно для атрибута Справочника:

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

Метод HasFlag () в настоящее время немного медленный, поэтому побитовая альтернатива быстрее и использует меньше ресурсов. HasFlag удобен для получения быстрого и простого ответа на то, включен или выключен желаемый бит во флаге, без каких-либо знаний о значениях битов или двоичных данных в целом.

0 голосов
/ 20 января 2011

Проверяется, установлен ли флаг FileAttributes.Directory в перечислении, возвращаемом File.GetAttributes. Вы можете прочитать больше о том, как использовать перечисления флагов в этой записи на 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
}
0 голосов
/ 20 января 2011

Это побитовая AND операция.FileAttributes - перечисление Flags.Это означает, что каждый бит в числовом значении этого перечисления описывает некоторое логическое свойство этого файла, и их можно объединять.

0 голосов
/ 20 января 2011

Это побитовый оператор И.
http://en.wikipedia.org/wiki/Bitwise_operation

CodeSnipet выполняет побитовое И между двумя переменными и затем сравнивает значение с другой переменной, помещая результат в логическое значение.

...