C#接受这个:
this.MyMethod(enum.Value1 | enum.Value2);
和此:
this.MyMethod(enum.Value1 & enum.Value2);
区别是什么?
答案 0 :(得分:17)
执行|
时,您同时选择这两项。当您执行&
时,您只会重叠。
请注意,只有将[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");
答案 1 :(得分:9)
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的枚举值。
答案 2 :(得分:5)
一个是按位 - 或者另一个是按位 - 和。在前一种情况下,这意味着在结果中设置在一个或另一个中设置的所有位。在后一种情况下,这意味着在结果中设置所有共同的和在两者中设置的位。您可以在维基百科上阅读bitwise operators。
示例:
enum.Value1 = 7 = 00000111
enum.Value2 = 13 = 00001101
然后
enum.Value1 | enum.Value2 = 00000111
|00001101
= 00001111
= 15
和
enum.Value1 & enum.Value2 = 00000111
&00001101
= 00000101
= 5
答案 3 :(得分:4)
这个问题有一个很好的解释:What does the [Flags] Enum Attribute mean in C#?
答案 4 :(得分:2)
枚举参数可以是二进制数,例如
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
}