c#enum equals()vs ==

Tod*_*her 49 c# enums equals

在使用枚举的情况下,最好使用:

if (enumInstance.Equals(MyEnum.SomeValue))
Run Code Online (Sandbox Code Playgroud)

或使用

if (enumInstance == MyEnum.SomeValue)
Run Code Online (Sandbox Code Playgroud)

他们使用一个与另一个的重要考虑因素是什么?

Jon*_*eet 52

如果编译时类型enumInstance是枚举类型,那么你就可以了==.

如果编译时类型enumInstanceEnum,ValueType或者Object,您需要使用Equals.(如果==在这种情况下尝试使用,则会出现编译时错误.)

请注意,您的枚举当前违反了.NET命名约定 - 通常是这样MyEnum.Value.


Ale*_*iuc 29

使用==而不是Equals更快一点,不需要框枚举,这里不需要函数调用样本c#代码并为它生成MSIL:

 class Program
    {
        static void Main(string[] args)
        {
            var instance = MyEnum.First;

            if (instance == MyEnum.First)
            {
                Console.WriteLine("== Called");
            }

            if (instance.Equals(MyEnum.First))
            {
                Console.WriteLine("Equals called");
            }

        }     
    }

    enum MyEnum { First = 99, Second = 100}
Run Code Online (Sandbox Code Playgroud)

MSIL:

IL_0000:  nop
  IL_0001:  ldc.i4.s   99
  IL_0003:  stloc.0
  IL_0004:  ldloc.0
  IL_0005:  ldc.i4.s   99
  IL_0007:  ceq
  IL_0009:  ldc.i4.0
  IL_000a:  ceq
  IL_000c:  stloc.1
  IL_000d:  ldloc.1
  IL_000e:  brtrue.s   IL_001d
  IL_0010:  nop
  IL_0011:  ldstr      "== Called"
  IL_0016:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_001b:  nop
  IL_001c:  nop
  IL_001d:  ldloc.0
  IL_001e:  box        ConsoleApplication1.MyEnum
  IL_0023:  ldc.i4.s   99
  IL_0025:  box        ConsoleApplication1.MyEnum
  IL_002a:  callvirt   instance bool [mscorlib]System.Object::Equals(object)
  IL_002f:  ldc.i4.0
  IL_0030:  ceq
  IL_0032:  stloc.1
  IL_0033:  ldloc.1
  IL_0034:  brtrue.s   IL_0043
  IL_0036:  nop
  IL_0037:  ldstr      "Equals called"
  IL_003c:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0041:  nop
  IL_0042:  nop
  IL_0043:  ret
Run Code Online (Sandbox Code Playgroud)

如你所见==生成ceq指令,Equals方法执行拳击和callvirt


use*_*603 5

作为 Jon Skeet 旧答案的扩展,确实会在您比较时遇到编译错误Enum == YourActualEnum.Value,但是当您这样做时Enum == Enum,编译正常,它始终返回 false。

public class TestClass
{
    public bool TestMethod1()
    {
        bool Result = false;

        Enum l_Value = TEST_ENUM.TEST_VALUE_1;

        Enum l_Check_Value = TEST_ENUM.TEST_VALUE_1;

        Result = l_Value == l_Check_Value;

        return Result;
    }

    public bool TestMethod2()
    {
        bool Result = false;

        TEST_ENUM l_Value = TEST_ENUM.TEST_VALUE_1;

        TEST_ENUM l_Check_Value = TEST_ENUM.TEST_VALUE_1;

        Result = l_Value == l_Check_Value;

        return Result;
    }

    public bool TestMethod3()
    {
        bool Result = false;

        Enum l_Value = TEST_ENUM.TEST_VALUE_1;

        Enum l_Check_Value = TEST_ENUM.TEST_VALUE_1;

        Result = l_Value.Equals(l_Check_Value);

        return Result;
    }

    public enum TEST_ENUM
    {
        TEST_VALUE_1,
        TEST_VALUE_2,
        TEST_VALUE_3
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您在测试应用程序上尝试以下操作,您将获得以下结果

Console.WriteLine("Method 1 result: {0}", myClass.TestMethod1());

Console.WriteLine("Method 2 result: {0}", myClass.TestMethod2());

Console.WriteLine("Method 3 result: {0}", myClass.TestMethod3());
Run Code Online (Sandbox Code Playgroud)

你会得到以下结果

Method 1 result: False Method 2 result: True Method 3 result: True

如果您想知道为什么要将 Enum 与 Enum 进行比较....我在为 WPF 项目创建 EnumConverter 和 FlagConvert 时尝试变得聪明时发现了它。在那里你只收到一个对象值作为参数,特别是对于标志转换器,我想为没有选择标志时提供一个特殊的文本(即枚举的值为 0,它没有静态成员)。

除了这个之外没有其他工作(包括 value.Equals(0), value.Equals((int)0) ):

l_Source_Type = value.GetType();

if (l_Source_Type.IsDefined(typeof(FlagsAttribute)))
{
    Enum l_Value = (Enum)value;

    Enum l_Check_Value = (Enum)Enum.ToObject(l_Source_Type, 0);

    if (l_Value.Equals(l_Check_Value))
    {
        return String.Empty;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 介意解释一下否决票吗?正如我所说,我无法发表评论,我添加此内容是为了帮助其他与我有相同问题的人,因为我在寻找解决我的问题时最终得到了这个答案。 (2认同)