61

列挙型を使用する場合は、使用する方が良いですか:

if (enumInstance.Equals(MyEnum.SomeValue))

または使用する

if (enumInstance == MyEnum.SomeValue)

どちらか一方を使用する重要な考慮事項はありますか?

4

4 に答える 4

56

のコンパイル時の型がenumInstance列挙型の場合は、 で問題ありません==

のコンパイル時の型enumInstanceEnumValueTypeまたはObjectの場合は、 を使用する必要がありますEquals。(その場合に使用しようとすると、コンパイル時エラーが発生します==。)

現在、列挙型は .NET 命名規則に違反していることに注意してください。通常はMyEnum.Value.

于 2013-07-05T15:22:50.070 に答える
34

Equals の代わりに == を使用すると少し速くなります。enum をボックス化する必要はなく、関数呼び出しも必要ありません。ここではサンプルの 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}

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

ご覧のとおり、== は ceq 命令を生成し、Equals メソッドはボックス化と callvirt を実行します

于 2013-07-05T15:50:18.477 に答える