Существует ли преимущество для того, чтобы хранить объект в переменной прежде, чем назвать метод на нем?

Пример 1:

SomeObject someObject = new SomeObject();
if (someObject.Method())
{
    //do stuff
}
//someObject is never used again

по сравнению с

Пример 2:

if (new SomeObject().Method())
{
    //do stuff
}

Там какое-либо преимущество к использованию первого метода по второму, или наоборот?

5
задан Ryan Kohn 18 June 2010 в 20:47
поделиться

4 ответа

Есть по крайней мере три потенциальных преимущества:

  1. Читабельность: первое во многих случаях более очевидно, чем синтаксис второго примера, особенно для начинающих разработчиков.

  2. Лучший опыт отладки: Если конструктор для SomeObject выбрасывает исключение, в первом случае отладчик прервется на этой строке. Во втором случае не очевидно, где произошло исключение - в конструкторе или в методе. Та же проблема возникает при установке точек останова и проверке значений на объекте - во втором случае это будет сложно, и потребуется установить точку останова внутри метода.

  3. В первом случае вы можете использовать объект вне этого единственного вызова. Если вам действительно нужен метод только для одного вызова, и вам не нужна ссылка на объект, то статический метод может быть более подходящим.

12
ответ дан 18 December 2019 в 09:47
поделиться

Я бы предпочел первый вариант для улучшения читабельности, например:

var phoneNumberRx = new Regex(@"^\(\d{3}\)\d{3}-\d{4}$");
0
ответ дан 18 December 2019 в 09:47
поделиться

В большинстве тривиальных случаев компилятор все равно удалит его. С типами значений есть важный момент, заключающийся в том, что копирование его в переменную клонирует значение, поэтому может представлять собой существенное изменение, но вы все равно не должны поощрять изменяемые типы значений.

С плавающей запятой есть некоторые крайние случаи, когда при использовании локального вы получаете разные ответы (собственные типы имеют большую ширину, чем Single / Double и т. Д.) - что также означает, что вы можете получить разные результаты с отладкой / выпуском (в зависимости от того, удалена ли переменная компилятором).

Также бывают случаи, когда переменная может делать больше, чем значение в стеке - т.е. быть «захваченной» лямбда / анон-методом или использоваться для out / ref , но это применимо редко.

3
ответ дан 18 December 2019 в 09:47
поделиться

Может быть полезно при отладке, чтобы иметь возможность видеть значение (и если объект был чем-то в COM interop или подобном, что вам нужно утилизировать, может быть важно сохранить ссылку, чтобы вы могли сделать это контролируемым образом).

Если имена длинные или если есть несколько уровней вложенности, это также может быть проще для чтения.

2
ответ дан 18 December 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: