Оценка компилятором явной проверки нуля и оператора объединения нулей?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Оценка компилятором явной проверки нуля и оператора объединения нулей?

Сообщение Anonymous »

Рассмотрим следующий код, в котором используются два слегка разных метода для проверки _instance и назначения его, если он еще не установлен.

Код: Выделить всё

class InstantiationTest
{
private Object _instance;

public void Method1() {
if(_instance == null) {
_instance = new Object();
}
}

public void Method2() {
_instance = _instance ?? new Object();
}
}
Либо VS, либо Resharper продолжают подчеркивать мои явные проверки на нулевое значение и предлагать мне выполнить рефакторинг с использованием оператора объединения нулей.

Мне интересно, достаточно ли умен компилятор, чтобы обнаружить случай в Method2(), когда _instance переназначается самому себе (фактически nop? ) и перепишите Method2() в Method1().

Я вижу, что на самом деле это не так:

Код: Выделить всё

Test.Method1:
IL_0000:  ldarg.0
IL_0001:  ldfld       UserQuery+Test._instance
IL_0006:  brtrue.s    IL_0013
IL_0008:  ldarg.0
IL_0009:  newobj      System.Object..ctor
IL_000E:  stfld       UserQuery+Test._instance
IL_0013:  ret
по сравнению:

Код: Выделить всё

Test.Method2:
IL_0000:  ldarg.0
IL_0001:  ldarg.0
IL_0002:  ldfld       UserQuery+Test._instance
IL_0007:  dup
IL_0008:  brtrue.s    IL_0010
IL_000A:  pop
IL_000B:  newobj      System.Object..ctor
IL_0010:  stfld       UserQuery+Test._instance
IL_0015:  ret
Мой вопрос: почему?

Это сложно реализовать на уровне компилятора, слишком тривиально, чтобы окупать усилия по реализации, или мне чего-то не хватает?

Подробнее здесь: https://stackoverflow.com/questions/815 ... g-operator
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»