C# 如何获取传递给方法的特定枚举的开关值
我正在尝试获取传递给方法的特定枚举的哪些值,以及传递枚举时|和&运算符之间的区别是什么 枚举:C# 如何获取传递给方法的特定枚举的开关值,c#,C#,我正在尝试获取传递给方法的特定枚举的哪些值,以及传递枚举时|和&运算符之间的区别是什么 枚举: enum VectorAxis { X,Y,Z } void SampleMethod(VectorAxis ignoredAxis) { // Get witch enums passed } SampleMethod(VectorAxis.X | VectorAxis.Y); 方法: enum VectorAxis { X,Y,Z } void SampleMethod(V
enum VectorAxis
{
X,Y,Z
}
void SampleMethod(VectorAxis ignoredAxis)
{
// Get witch enums passed
}
SampleMethod(VectorAxis.X | VectorAxis.Y);
方法:
enum VectorAxis
{
X,Y,Z
}
void SampleMethod(VectorAxis ignoredAxis)
{
// Get witch enums passed
}
SampleMethod(VectorAxis.X | VectorAxis.Y);
呼叫方:
enum VectorAxis
{
X,Y,Z
}
void SampleMethod(VectorAxis ignoredAxis)
{
// Get witch enums passed
}
SampleMethod(VectorAxis.X | VectorAxis.Y);
或
SampleMethod(VectorAxis.X & VectorAxis.Y);
首先,应该将属性应用于枚举。这将指示可以将枚举视为一组标志:
[Flags]
enum VectorAxis
{
// Consider also adding value None = 0 when no axis ignored
X = 1,
Y = 2,
Z = 4
}
现在,您可以对枚举值使用位运算符:
SampleMethod(VectorAxis.X | VectorAxis.Y); // pass both axis using bitwise OR
它是如何工作的?如果您查看枚举值的二进制表示形式
X = 001
Y = 010
Z = 100
当您对X
和Y
应用按位OR运算时(如果任何值在同一位置上的位设置为1,则结果的位设置为1),您将得到011
。这就是将传递给该方法的内容。在该方法中,可以使用按位AND检查轴是否通过
public void SampleMethod(VectorAxis ignoredAxis)
{
if ((ignoredAxis & VectorAxis.X) == VectorAxis.X) // check using bitwise AND
// X is ignored
}
传递值011
和X001
的按位AND(只有当两个值在同一位置上的位都设置为1时,才有1)的结果仅当传递值中启用相应位时,才返回X
的值
011 & 001 = 001 // X is ignored
011 & 010 = 010 // Y is ignored
011 & 100 = 000 // Z is not ignored
您也可以使用执行相同操作的Enum.hasvag
方法,而不是手动检查值
if (ignoredAxis.HasFlag(VectorAxis.X))
首先,应该将属性应用于枚举。这将指示可以将枚举视为一组标志:
[Flags]
enum VectorAxis
{
// Consider also adding value None = 0 when no axis ignored
X = 1,
Y = 2,
Z = 4
}
现在,您可以对枚举值使用位运算符:
SampleMethod(VectorAxis.X | VectorAxis.Y); // pass both axis using bitwise OR
它是如何工作的?如果您查看枚举值的二进制表示形式
X = 001
Y = 010
Z = 100
当您对X
和Y
应用按位OR运算时(如果任何值在同一位置上的位设置为1,则结果的位设置为1),您将得到011
。这就是将传递给该方法的内容。在该方法中,可以使用按位AND检查轴是否通过
public void SampleMethod(VectorAxis ignoredAxis)
{
if ((ignoredAxis & VectorAxis.X) == VectorAxis.X) // check using bitwise AND
// X is ignored
}
传递值011
和X001
的按位AND(只有当两个值在同一位置上的位都设置为1时,才有1)的结果仅当传递值中启用相应位时,才返回X
的值
011 & 001 = 001 // X is ignored
011 & 010 = 010 // Y is ignored
011 & 100 = 000 // Z is not ignored
您也可以使用执行相同操作的Enum.hasvag
方法,而不是手动检查值
if (ignoredAxis.HasFlag(VectorAxis.X))
这通常是为了统一由枚举表示的不同条件。然后,当您使用
和时,您希望两者都能得到满足。当使用|
时,其中一个就足够了
如果这些是按位运算符,则通常为枚举设置的值是2的幂,然后可以使用所有值的总和组合两个或多个值。检查此示例:
public enum Values {
A = 1,
B = 2,
C = 4,
D = 8,
B_And_D = 10, // Both B and D applies
A_B_C_And_D = 15, // All apply
}
public static void Main()
{
var input = Values.B & Values.B_And_D;
Console.WriteLine(input); // returns B
var input2 = Values.B | Values.B_And_D;
Console.WriteLine(input2); // returns B_And_D
var input3 = Values.B_And_D & Values.A_B_C_And_D;
Console.WriteLine(input3); // returns B_And_D
var input4 = Values.B_And_D | Values.A_B_C_And_D;
Console.WriteLine(input4); // returns A_B_C_And_D
}
通常,您可以使用Flags
属性应用此逻辑,这将大大简化组合条件的逻辑(您不需要手动添加条件):这通常用于统一由枚举表示的不同条件。然后,当您使用和时,您希望两者都能得到满足。当使用|
时,其中一个就足够了
如果这些是按位运算符,则通常为枚举设置的值是2的幂,然后可以使用所有值的总和组合两个或多个值。检查此示例:
public enum Values {
A = 1,
B = 2,
C = 4,
D = 8,
B_And_D = 10, // Both B and D applies
A_B_C_And_D = 15, // All apply
}
public static void Main()
{
var input = Values.B & Values.B_And_D;
Console.WriteLine(input); // returns B
var input2 = Values.B | Values.B_And_D;
Console.WriteLine(input2); // returns B_And_D
var input3 = Values.B_And_D & Values.A_B_C_And_D;
Console.WriteLine(input3); // returns B_And_D
var input4 = Values.B_And_D | Values.A_B_C_And_D;
Console.WriteLine(input4); // returns A_B_C_And_D
}
通常,您可以使用Flags
属性应用此逻辑,这将大大简化组合条件的逻辑(无需手动添加条件):枚举的工作方式与整数类似,每个枚举值都有一个数值。如果您没有将该值设置为任何值并将其保留为默认值(就像您对VectorAxis
所做的那样),则它们的值将从0
到基础类型的限制(通常为int,除非您更改它)。这意味着对它们执行位操作与对整数执行位操作相同
如果您不知道按位运算是如何工作的,您可以阅读有关它们的内容
如果您希望能够使用它们,则必须将值设置为2的幂。让我们这样做:
enum VectorAxis
{
X = 1,
Y = 2,
Z = 4,
}
为了便于打印,我们添加flags属性
[Flags]
enum VectorAxis
现在,如果您将VectorAxis.X | VectorAxis.Y
打印到控制台,您将获得X,Y
。
如果您想知道传递的值是否具有Z
标志,可以使用按位和
:
(ignoredAxis & VectorAxis.Z) != 0
如果使用VectorAxis.X | VectorAxis.Y
调用SampleMethod
,则结果为false。但如果将参数更改为VectorAxis.X | VectorAxis.Z
,则结果将为真。您可以使用它来检查每个轴。枚举就像一个整数一样工作,每个枚举值都有一个数值。如果您没有将该值设置为任何值并将其保留为默认值(就像您对VectorAxis
所做的那样),则它们的值将从0
到基础类型的限制(通常为int,除非您更改它)。这意味着对它们执行位操作与对整数执行位操作相同
如果您不知道按位运算是如何工作的,您可以阅读有关它们的内容
如果您希望能够使用它们,则必须将值设置为2的幂。让我们这样做:
enum VectorAxis
{
X = 1,
Y = 2,
Z = 4,
}
为了便于打印,我们添加flags属性
[Flags]
enum VectorAxis
现在,如果您将VectorAxis.X | VectorAxis.Y
打印到控制台,您将获得X,Y
。
如果您想知道传递的值是否具有Z
标志,可以使用按位和
:
(ignoredAxis & VectorAxis.Z) != 0
如果使用VectorAxis.X | VectorAxis.Y
调用SampleMethod
,则结果为false。但如果将参数更改为VectorAxis.X | VectorAxis.Z
,则结果将为真。您可以使用此选项检查每个轴。行为将取决于设置为枚举的值(通常将其设置为2的幂)。请查看按位运算符文档:也可以查看以下答案,它非常详细地解释了这通常如何与枚举一起工作/使用:它们是