Приветствую, сегодня я делал ленивый код инициализации и подумал, почему бы не использовать для этого оператор объединения с нулевым значением, он короче, но потом я подумал, есть ли какие-либо накладные расходы или дополнительные затраты на выполнение этого таким образом.
Ниже приведен упрощенный пример кода, показывающий более распространенную форму, используемую для отложенной инициализации, а затем форму с использованием оператора объединения с нулевым значением. Они имеют точно такие же результаты и кажутся эквивалентными. Мои первые мысли заключаются в том, что после того, как объект был создан, теперь происходит его дополнительное присвоение самому себе с помощью ??
. Является ли это не проблемой, и компилятор/JIT каким-то образом оптимизирует это, происходит ли что-то более гнусное, и вам никогда не следует выполнять ленивую инициализацию с помощью ??
, или это совершенно безопасно, и от него не может исходить плохое моджо.
private MyLazyObject _lazyObject;
public MyLazyObject GetMyLazyObjectUsingMoreCommonMethod()
{
if (_lazyObject != null)
return _lazyObject;
_lazyObject = new MyLazyObject();
return _lazyObject;
}
public MyLazyObject GetMyLazyObjectUsingNullCoalescingOpMethod()
{
_lazyObject = _lazyObject ?? new MyLazyObject();
return _lazyObject;
}
return _lazyObject ?? (_lazyObject = new MyLazyObject());
Это все еще читабельно? YMMV. - person Marc   schedule 14.09.2011if(_lazyObj == null) _lazyObj = new MyLazyObj(); return _lazyObj;
, она будет более читабельной и короче. - person Adam Lear   schedule 14.09.2011return _lazyObject ?? new MyLazyObject());
- person Brad Cunningham   schedule 14.09.2011return _lazyObject ??= new MyLazyObject();
- person Zodman   schedule 04.02.2021