[英]c# enum equals() vs ==
在使用枚舉的情況下,最好使用:
if (enumInstance.Equals(MyEnum.SomeValue))
或使用
if (enumInstance == MyEnum.SomeValue)
他們使用一個與另一個的重要考慮因素是什么?
如果編譯時類型的enumInstance
是枚舉類型,那么你可以使用==
。
如果enumInstance
的編譯時類型是Enum
, ValueType
或Object
,則需要使用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.