Очевидно, что 2 реализации очень похожи, разница будет незначительной в памяти , выделениях и циклах .
Компилятор в основном обрабатывает их следующим образом (для ссылочных типов)
First
MyType myType = SomeMethod();
if (myType != null)
{
Console.WriteLine(myType.ToString());
}
Второй
MyType myType2;
if ((object)(myType2 = SomeMethod()) != null)
{
Console.WriteLine(myType2.ToString());
}
Вероятно, лучше видно с IL
Первый
IL_0000: ldarg.0
IL_0001: call instance class C/MyType C::SomeMethod()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: brfalse.s IL_0015
IL_000a: ldloc.0
IL_000b: callvirt instance string[mscorlib] System.Object::ToString()
IL_0010: call void[mscorlib] System.Console::WriteLine(string)
Второй
IL_0015: ldarg.0
IL_0016: call instance class C/MyType C::SomeMethod()
IL_001b: dup
IL_001c: stloc.1
IL_001d: brfalse.s IL_002a
IL_001f: ldloc.1
IL_0020: callvirt instance string[mscorlib] System.Object::ToString()
IL_0025: call void[mscorlib] System.Console::WriteLine(string)
Примечание : вы можете проверить разборку, IL и jit-asm здесь
Разница IL в основном составляет 2 кода операции:
dup
: копирует текущее верхнее значение в стек оценки, а затем помещает копию в стек оценки.
Ldloc
: загружает локальную переменную с определенным индексом в стек оценки.
Когда соединено , наиболее вероятно оптимизирует в те же инструкции в любом случае
Резюме
- Нет заметных технических отличий.
- Да, версия
is
немного более аккуратная и более краткая, я думаю.
- Это, вероятно, больше пригодных для печати фрахтователей, так что если у вас есть печатаемый персонаж OCD или вы столкнулись с брутальными кодами, это может быть не очень хорошо
- Если вам это нравится, и вашей команде это нравится, продолжайте.
- Это не совсем моя чашка чая