Подтвердить что ты не робот

С# Разница между передачей нескольких значений enum с помощью канала и амперсанда

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

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

и это:

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

В чем разница?

4b9b3361

Ответ 1

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

Обратите внимание, что эти операторы имеют смысл только при применении атрибута [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");

Ответ 2

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

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

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

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

Ответ 3

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

Пример:

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

затем

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

и

enum.Value1 & enum.Value2 = 00000111
                           &00001101
                          = 00000101   
                          = 5

Ответ 5

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

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
}