Рассмотрим следующий типичный сценарий:
if(myObject == null) {
myObject = new myClass();
}
Мне интересно, что думают о следующей замене с использованием оператора нуль-слияния:
myObject = myObject ?? new myClass();
Я не уверен, должен ли я использовать вторую форму. Это кажется хорошим сокращением, но myObject = myObject
конструкция в начале кажется, что это может быть немного запахом кода.
Это разумная вещь, или есть лучшая стенография, которую мне не хватает? Или, может быть, «Это три линии, преодолеть это!»?
Изменить: Как уже упоминалось, возможно, назвать это типичным сценарием является чем-то завышенным. Обычно я сталкиваюсь с такой ситуацией, когда извлекаю сущность из базы данных, у которой есть свойство дочернего ссылочного типа, которое может быть заполнено или не заполнено:
myClass myObject = myClassService.getById(id);
myObject.myChildObject = myObject.myChildObject ?? new myChildClass();
MyClass
следует предоставитьpublic static readonly
элементEmpty
значения его типа. СмотритеString.Empty
на MSDN .??=
оператора?Ответы:
Я использую оператор слияния null все время. Мне нравится лаконичность этого.
Я считаю, что этот оператор по своей природе похож на троичный оператор (A? B: C). Требуется немного практики, прежде чем читать это станет второй натурой, но как только вы привыкнете, я чувствую, что читаемость улучшается по сравнению с рукописными версиями.
Кроме того, ситуация, которую вы описываете, является только одним сценарием, где оператор полезен. Также удобно заменять конструкции следующим образом:
или
с
источник
myObject = myObject2 ?? myObject3
. Что меня особенно интересует, так это использование оператора для установки самого объекта, если он не равен нулю.null
это сравнение.Оператор
?? operator
называется null-coalescing и используется для определения значения по умолчанию для типов значений NULL или ссылочных типов. Возвращает левый операнд, если операнд не равен нулю; в противном случае он возвращает правильный операнд.myObject = myObject ?? new myObject();
-instantiate default value of object
Более подробная информация и пример кода об операторе слияния - статья MSDN .
Если вы проверите для
more than nullable
условия, в качестве альтернативы вы можете использовать троичный оператор.Тернарный оператор
Вы тоже можете посмотреть ?: Оператор . Это называется тернарным или условным оператором. Условный оператор (? :) возвращает одно из двух значений в зависимости от значения логического выражения.
Пример кода из MSDN -?: Оператор (C # Reference) :
источник
myObject = (myObject == null) ? new myClass() : myObject
. Так что, если я не пропущу лучшее использование условного оператора, у него, похоже, есть та же «проблема» с установкой объекта себе (если он не нулевой), как с оператором слияния с нулем - и он менее лаконичен.Я не думаю, что сценарий является (или, по крайней мере, должен быть) типичным.
Если вы хотите, чтобы значение некоторого поля по умолчанию не было
null
, установите его в инициализаторе поля:Или, если инициализация более сложная, установите ее в конструкторе.
Если вы хотите создавать
myClass
только тогда, когда это действительно нужно (например, потому что создание занимает много времени), тогда вы можете использоватьLazy<T>
:(Это вызывает конструктор по умолчанию. Если инициализация более усложняется, передать лямбда , что создает
myClass
вLazy<T>
конструкторе.)Чтобы получить доступ к значению, используйте
myObject.Value
, который вызовет инициализацию, если вы обращаетесь в первый разmyObject.Value
.источник
Особенно мне нравится использовать
??
в сочетании с дополнительными параметрами метода. Я ограничиваю потребность в перегрузках и гарантирую, что вещь имеет ценность.источник