2013-07-05 52 views
35

在使用枚舉的情況下,是它更好地使用:C#枚舉的equals()與==

if (enumInstance.Equals(MyEnum.SomeValue)) 

或使用

if (enumInstance == MyEnum.SomeValue) 

是他們使用一個VS的任何重要的考慮因素其他?

+0

我喜歡這種感覺可能已經之前,我只是找不到在哪裏回答。如果它已被回答讓我知道,我會刪除這個問題 – ToddBFisher

+5

幾乎*每個問題都問在SO以前在這裏問過...應該有一個問號一個真正獨特的問題徽章。 –

+0

http://stackoverflow.com/questions/814878/c-sharp-difference-between-and-equals – jAC

回答

39

如果enumInstance的編譯時間類型是枚舉類型,那麼使用==即可。

如果enumInstance的編譯時類型爲EnumValueTypeObject,你需要使用Equals。 (如果在這種情況下嘗試使用==,則會發生編譯時錯誤。)

請注意,您的枚舉目前違反.NET命名約定 - 通常爲MyEnum.Value

+0

在枚舉被聲明爲具有多個屬性/值的情況下設置爲相同的數字,.Equals()在比較之前將其轉換爲數字表示形式嗎?那麼,是否違背了多個枚舉屬性/值具有相同基礎數值的最佳實踐? – ToddBFisher

+0

@TdBdBFisher:*有*只是一個數字表示。兩個名稱相同的值仍然具有相同的值。在某些情況下,有多個名稱具有相同的值會很有用,但這種情況很少見,只有在您確實希望它們表示相同的情況時才能使用。一個例子是,如果以前的版本有一個名稱的拼寫錯誤,並且您想修正錯字而不破壞舊的源代碼。 –

+0

這造成了一個非常鬼鬼祟祟的錯誤,涉及一個泛型集合的'params Func []'比較擴展方法。 – Michael

19

使用==的不是等於是有點快,也沒有必要框枚舉和這裏不需要函數的調用是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方法performes拳擊和callvirt

+3

用於裝配 –

0

有,這裏的其他答案還沒有提到,可以幫助其他的情況下,秒。

隨着c#的基本類型的枚舉是一個積分。因爲它是一個不可分割的部分,所以可以邏輯地將枚舉或OR排列在一起。

如果枚舉在邏輯上「或」在一起,當使用上述任一方法進行相等時將會失敗。

因此,對於一些特殊情況,例如使用枚舉作爲標誌,您需要在檢查相等性之前首先在邏輯上將您正在測試的情況與第一種情況進行比較。

if ((enumInstance & MyEnum.SomeValue).Equals(MyEnum.SomeValue)) 

if ((enumInstance & MyEnum.SomeValue) == MyEnum.SomeValue) 

嚴格來說,它是最安全的使用 「==」 使用枚舉。

可能枚舉類型的完整列表可以在這裏找到:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/enum