Разница C # между передачей нескольких значений перечисления с помощью pipe и амперсанда - PullRequest
13 голосов
/ 09 ноября 2010

C # принимает это:

this.MyMethod(enum.Value1 | enum.Value2);

и это:

this.MyMethod(enum.Value1 & enum.Value2);

Какая разница?

Ответы [ 5 ]

18 голосов
/ 09 ноября 2010

Когда вы делаете |, вы выбираете оба. Когда вы делаете &, вы только то, что перекрывается.

Обратите внимание, что эти операторы имеют смысл, только когда вы применяете атрибут [Flags] к своему перечислению. См. http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx для полного объяснения этого атрибута.

В качестве примера приведем следующее перечисление:

[Flags]
public enum TestEnum
{
    Value1 = 1,
    Value2 = 2,
    Value1And2 = Value1 | Value2
}

И несколько тестовых случаев:

var testValue = TestEnum.Value1;

Здесь мы проверяем, что testValue перекрывается с Value1And2 (т.е. является частью):

if ((testValue & TestEnum.Value1And2) != 0)
    Console.WriteLine("testValue is part of Value1And2");

Здесь мы проверяем, точно ли testValue равно Value1And2. Это, конечно, не так:

if (testValue == TestEnum.Value1And2)
    Console.WriteLine("testValue is equal to Value1And2"); // Will not display!

Здесь мы проверяем, точно ли комбинация testValue и Value2 равна Value1And2:

if ((testValue | TestEnum.Value2) == TestEnum.Value1And2)
    Console.WriteLine("testValue | Value2 is equal to Value1And2");
9 голосов
/ 09 ноября 2010
this.MyMethod(enum.Value1 | enum.Value2);

Это будет поразрядно 'ИЛИ' два значения перечисления вместе, поэтому, если enum.Value равно 1, а enum.Value2 равно 2, результатом будет значение перечисления для 3 (если оно существует, в противном случае это будет просто целое число 3). ).

this.MyMethod(enum.Value1 & enum.Value2);

Это будет поразрядно 'И' два значения перечисления вместе, поэтому, если enum.Value равно 1, а enum.Value2 равно 3, результатом будет значение перечисления для 1.

5 голосов
/ 09 ноября 2010

Один - побитовый - или другой - побитовый - и. В первом случае это означает, что все биты, которые установлены в одном или другом, установлены в результате. В последнем случае это означает, что все биты, которые являются общими и установлены в обоих, установлены в результате. Вы можете прочитать о побитовых операторах в Википедии.

Пример:

enum.Value1 = 7  = 00000111
enum.Value2 = 13 = 00001101

тогда

enum.Value1 | enum.Value2 = 00000111
                           |00001101
                          = 00001111
                          = 15

и

enum.Value1 & enum.Value2 = 00000111
                           &00001101
                          = 00000101   
                          = 5
4 голосов
/ 09 ноября 2010

Этот вопрос имеет хорошее объяснение: Что означает атрибут Enum [Flags] в C #?

2 голосов
/ 09 ноября 2010

Параметры перечисления могут быть двоичными числами, например

enum WorldSides
{
    North=1,
    West=2,
    South=4,
    East=8
}

WorldSides.North | WorldSides.West = both values -> 3

Итак, | используется для объединения значений.

Используйте & для удаления некоторой части значения, например

if (ws & WorldSides.North)
{
     //  ws has north component
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...