С# принимает это:
this.MyMethod(enum.Value1 | enum.Value2);
и это:
this.MyMethod(enum.Value1 & enum.Value2);
В чем разница?
С# принимает это:
this.MyMethod(enum.Value1 | enum.Value2);
и это:
this.MyMethod(enum.Value1 & enum.Value2);
В чем разница?
Когда вы выполняете |
, вы выбираете оба. Когда вы выполняете &
, вы получаете только то, что перекрывается.
Обратите внимание, что эти операторы имеют смысл только при применении атрибута [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");
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.
Один побитовый, или другой побитовый - и. В первом случае это означает, что все биты, которые установлены в одном или другом, задаются в результате. В последнем случае это означает, что все биты, которые являются общими и установлены в обоих, устанавливаются в результате. Вы можете прочитать о побитовых операторах в Википедии.
Пример:
enum.Value1 = 7 = 00000111
enum.Value2 = 13 = 00001101
затем
enum.Value1 | enum.Value2 = 00000111
|00001101
= 00001111
= 15
и
enum.Value1 & enum.Value2 = 00000111
&00001101
= 00000101
= 5
В этом вопросе есть приятное объяснение: Что означает атрибут Enum [Flags] Enum в С#?
Параметры перечисления могут быть двоичными числами, например
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
}