C# разница между передачей нескольких значений перечисления с помощью трубы и амперсанда

в C# можно так:

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

и так:

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

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

5 ответов


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

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

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.


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

пример:

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

затем

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

и

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

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


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

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

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

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

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

if (ws & WorldSides.North)
{
     //  ws has north component
}