簡體   English   中英

c#enum equals()vs ==

[英]c# enum equals() vs ==

在使用枚舉的情況下,最好使用:

if (enumInstance.Equals(MyEnum.SomeValue))

或使用

if (enumInstance == MyEnum.SomeValue)

他們使用一個與另一個的重要考慮因素是什么?

如果編譯時類型的enumInstance是枚舉類型,那么你可以使用==

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

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

使用==而不是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}

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

有一種情況,這里的其他答案沒有提到可以幫助他人。

使用c#,枚舉的基礎類型是不可或缺的。 因為它是不可或缺的,所以您可以將枚舉邏輯OR組合在一起。

如果枚舉在邏輯上與OR一起使用,則使用上述任一方法進行相等操作將失敗。

因此,對於某些特殊情況,例如使用枚舉作為標志,在檢查相等性之前,您需要首先邏輯地對要測試的情況進行AND。

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

作為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
    }
}

如果您在測試應用上嘗試以下操作,您將獲得以下內容

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

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

Console.WriteLine("Method 3 result: {0}", myClass.TestMethod3());

你會得到以下結果

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM