C#使用管道和符号传递多个枚举值之间的差异

时间:2010-11-09 12:42:35

标签: c# .net parameters enums parameter-passing

C#接受这个:

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

和此:

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

区别是什么?

5 个答案:

答案 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;

我们在此测试testValueValue1And2重叠(即属于):

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!

在这里,我们测试testValueValue2的组合是否完全等于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
}