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

Die*_*ego 14 .net c# parameters enums parameter-passing

C#接受这个:

this.MyMethod(enum.Value1 | enum.Value2);
Run Code Online (Sandbox Code Playgroud)

还有这个:

this.MyMethod(enum.Value1 & enum.Value2);
Run Code Online (Sandbox Code Playgroud)

有什么不同?

Pie*_*kel 19

当你这样做时|,你选择两者.当你这样做时&,你只会重叠.

请注意,这些运算符仅在将[Flags]属性应用于枚举时才有意义.有关此属性的完整说明,请参见http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx.

例如,以下枚举:

[Flags]
public enum TestEnum
{
    Value1 = 1,
    Value2 = 2,
    Value1And2 = Value1 | Value2
}
Run Code Online (Sandbox Code Playgroud)

还有一些测试用例:

var testValue = TestEnum.Value1;
Run Code Online (Sandbox Code Playgroud)

在这里,我们测试testValueValue1And2(即属于)的重叠:

if ((testValue & TestEnum.Value1And2) != 0)
    Console.WriteLine("testValue is part of Value1And2");
Run Code Online (Sandbox Code Playgroud)

在这里我们测试是否testValue完全相等Value1And2.这当然不是真的:

if (testValue == TestEnum.Value1And2)
    Console.WriteLine("testValue is equal to Value1And2"); // Will not display!
Run Code Online (Sandbox Code Playgroud)

在这里,我们测试testValue和的组合是否Value2完全等于Value1And2:

if ((testValue | TestEnum.Value2) == TestEnum.Value1And2)
    Console.WriteLine("testValue | Value2 is equal to Value1And2");
Run Code Online (Sandbox Code Playgroud)


SwD*_*n81 9

this.MyMethod(enum.Value1 | enum.Value2);
Run Code Online (Sandbox Code Playgroud)

这将两个枚举值按位"或",因此如果enum.Value为1且enum.Value2为2,则结果将为3的枚举值(如果它存在,否则它将只是整数3).

this.MyMethod(enum.Value1 & enum.Value2);
Run Code Online (Sandbox Code Playgroud)

这将两个枚举值按位"和",因此如果enum.Value为1且enum.Value2为3,则结果将为1的枚举值.


jas*_*son 5

一个是按位 - 或者另一个是按位 - 和.在前一种情况下,这意味着在结果中设置在一个或另一个中设置的所有位.在后一种情况下,这意味着在结果中设置所有共同的和在两者中设置的位.您可以阅读维基百科上的按位运算符.

例:

enum.Value1 = 7  = 00000111
enum.Value2 = 13 = 00001101
Run Code Online (Sandbox Code Playgroud)

然后

enum.Value1 | enum.Value2 = 00000111
                           |00001101
                          = 00001111
                          = 15
Run Code Online (Sandbox Code Playgroud)

enum.Value1 & enum.Value2 = 00000111
                           &00001101
                          = 00000101   
                          = 5
Run Code Online (Sandbox Code Playgroud)