Для сравнения я попытался скомпилировать
object myObj = null;
myObj = myObj ?? new object();
и
object myObj = null;
if(myObject == null)
{
myObj = new object();
}
внутри метода Main
.(Я использую MonoDevelop 2.4 на Mono 2.6.7)
Если код был оптимизирован, как и ожидалось, мы должны увидеть сгенерированный аналогичный IL.Вот IL для первой версии Main
:
.method public static hidebysig
default void Main (string[] args) cil managed
{
.entrypoint
.maxstack 3
.locals init (
object V_0)
IL_0000: ldnull
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: dup
IL_0004: brtrue IL_000f
IL_0009: pop
IL_000a: newobj instance void object::'.ctor'()
IL_000f: stloc.0
IL_0010: ret
}
и для второй версии:
.method public static hidebysig
default void Main (string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
object V_0)
IL_0000: ldnull
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: brtrue IL_000e
IL_0008: newobj instance void object::'.ctor'()
IL_000d: stloc.0
IL_000e: ret
}
Итак, первая версия (с использованием оператора нулевого слияния) имеетгенерируется немного больше IL.
Но есть две вещи, на которые нужно обратить внимание:Visual Studio, это вполне может быть другая история.Возможно, это оптимизировано в Microsoft с компилятором.И даже если с ними то же самое, компилятор другого человека может легко оптимизировать это.То, что что-то для некоторых компиляторов выполняется, вовсе не означает, что вы ожидаете этого от каждого компилятора.
CLR использует JIT.Даже если бы он не был оптимизирован во время компиляции, он, вероятно, был бы оптимизирован во время выполнения.На самом деле, это вполне может быть причиной того, что компиляция не так озабочена такой микрооптимизацией.