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
}