2010-06-18 4 views
5

Пример 1:Есть ли смысл хранить объект в переменной перед вызовом метода на нем?

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

против

Пример 2:

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

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

ответ

12

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

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

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

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

+0

Отличные очки. Благодаря! –

2

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

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

3

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

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

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

0

я благоприятствуют первый вариант улучшения читаемости и т.д .:

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