Есть ли преимущество для сохранения объекта в переменной перед вызовом метода для него? - PullRequest
5 голосов
/ 19 июня 2010

Пример 1:

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

против

Пример 2:

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

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

Ответы [ 4 ]

12 голосов
/ 19 июня 2010

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

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

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

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

3 голосов
/ 19 июня 2010

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

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

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

2 голосов
/ 19 июня 2010

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

Если имена длинные или имеется несколько уровней вложенности, их также легче читать.

0 голосов
/ 19 июня 2010

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

var phoneNumberRx = new Regex(@"^\(\d{3}\)\d{3}-\d{4}$");
...