C#使用管道和符号传递多个枚举值之间的差异
C#接受这一点:C#使用管道和符号传递多个枚举值之间的差异,c#,.net,parameters,enums,parameter-passing,C#,.net,Parameters,Enums,Parameter Passing,C#接受这一点: this.MyMethod(enum.Value1 | enum.Value2); 这是: this.MyMethod(enum.Value1 & enum.Value2); 有什么区别吗?当您执行时,您可以同时选择这两个选项。当您执行&时,您只需要选择重叠的部分。 请注意,只有将[Flags]属性应用于枚举时,这些运算符才有意义。有关此属性的完整说明,请参阅 例如,以下枚举: [Flags] public enum TestEnum { Value1 =
this.MyMethod(enum.Value1 | enum.Value2);
这是:
this.MyMethod(enum.Value1 & enum.Value2);
有什么区别吗?当您执行
时,您可以同时选择这两个选项。当您执行&
时,您只需要选择重叠的部分。
请注意,只有将[Flags]
属性应用于枚举时,这些运算符才有意义。有关此属性的完整说明,请参阅
例如,以下枚举:
[Flags]
public enum TestEnum
{
Value1 = 1,
Value2 = 2,
Value1And2 = Value1 | Value2
}
以及一些测试用例:
var testValue = TestEnum.Value1;
在此,我们测试testValue
与value1和2
重叠(即是以下内容的一部分):
这里,我们测试testValue
是否正好等于value1和2
。这当然不是事实:
if (testValue == TestEnum.Value1And2)
Console.WriteLine("testValue is equal to Value1And2"); // Will not display!
这里,我们测试testValue
和Value2
的组合是否完全等于value1和2
:
if ((testValue | TestEnum.Value2) == TestEnum.Value1And2)
Console.WriteLine("testValue | Value2 is equal to Value1And2");
一个是按位or,另一个是按位and。在前一种情况下,这意味着在一个或另一个中设置的所有位都在结果中设置。在后一种情况下,这意味着在结果中设置所有公共位和在两者中设置的位。你可以在维基百科上阅读 例如:
enum.Value1 = 7 = 00000111
enum.Value2 = 13 = 00001101
然后
及
这会将两个枚举值按位“或”组合在一起,因此如果enum.Value
为1,而enum.Value2
为2,则结果将是3的枚举值(如果存在,否则将仅为整数3)
这将两个枚举值按位“和”组合在一起,因此如果
enum.Value
为1,而enum.Value2
为3,则结果将是1的枚举值。这个问题有一个很好的解释:枚举参数可以是二进制数,例如
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
}
因此,|用于组合值
例如,使用(&T)去除部分值
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
}
传递
enum.Value1&enum.Value2
的可能性很小。我同意你的看法,这个答案是最好的回答
this.MyMethod(enum.Value1 & enum.Value2);
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
}