В случае использования перечислений лучше использовать:
if (enumInstance.Equals(MyEnum.SomeValue))
или использовать
if (enumInstance == MyEnum.SomeValue)
Есть ли у них какие-либо важные соображения, используя один против другого?
В случае использования перечислений лучше использовать:
if (enumInstance.Equals(MyEnum.SomeValue))
или использовать
if (enumInstance == MyEnum.SomeValue)
Есть ли у них какие-либо важные соображения, используя один против другого?
Если тип времени компиляции enumInstance
является типом перечисления, вы в порядке с ==
.
Если для типа времени enumInstance
для компиляции используется Enum
, ValueType
или Object
, вам нужно использовать Equals
. (Вы получите ошибку времени компиляции, если попытаетесь использовать ==
в этом случае.)
Обратите внимание, что ваше перечисление в настоящее время нарушает соглашения об именах .NET - обычно это будет MyEnum.Value
.
Использование == вместо Equals немного быстрее, нет необходимости в перечислении ящиков и нет необходимости в вызовах функций здесь, это пример кода С# и сгенерированный 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