Другой способ проверки 2 условий в одном и том же блоке? - PullRequest
0 голосов
/ 27 декабря 2011

Я только что видел этот код

if ((fsi.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
{
  //...
}

Это кажется немного странным. Другой способ тестирования? Я ожидаю, легко ожидать что-то вроде

if ((FirstName=="Richard") & (LastName == "DeFortune" )
{
  //...
}

С & в середине обоих тестов

Спасибо

Ответы [ 3 ]

1 голос
/ 27 декабря 2011

Если вы внимательно посмотрите FileAttribute - это Enum с атрибутом Mark as Flag.

Вы получите больше информации здесь: http://dotnetstep.blogspot.com/2009/01/flags-attribute-for-enum.html

Теперь одиночный '&' является побитовым оператором.

Пример

        // Get file Info
        System.IO.FileInfo info = new System.IO.FileInfo("C:\\TESTTT.txt");
        // Get attribute and convert into int for better understanding 
        int val = (int)info.Attributes;
        // In my case it is 33 whoes binary value for 8 bit   00100001.

        // now we perform bitwise end with readonly FileAttributes.ReadOly is 1
        // 00100001 & 00000001 = 00000001
        int isReadOlny = val & (int)System.IO.FileAttributes.ReadOnly;
        Console.WriteLine("IsReadOnly : " + isReadOlny.ToString());

        // 00100001 & 00010000 = 00000000
        int isDirectory = val & (int)System.IO.FileAttributes.Directory;
        Console.WriteLine("IsDirectory : " + isDirectory.ToString());

        Console.WriteLine(val);
        Console.ReadLine();

Надеюсь, это поможет вам.

1 голос
/ 27 декабря 2011

Это оператор по битам .

Проверяет, установлен ли fsi.Attributes бит FileAttributes.Directory.

0 голосов
/ 27 декабря 2011

Упомянутый здесь & является побитовым оператором, а не логическим и (&&).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...