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
和X
001
的按位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
和X
001
的按位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的幂)。请查看按位运算符文档:也可以查看以下答案,它非常详细地解释了这通常如何与枚举一起工作/使用:它们是