Распространенные идиомы c #, включая coalesce ??оператор - PullRequest
7 голосов
/ 25 февраля 2010

Каждый знает, по крайней мере, две распространенные идиомы c #, включая оператор coalesce:

синглтон:

return _staticField = _staticField ?? new SingletonConstructor();

и цепной:

notNullableResult = nullable1 ?? nullable2 ?? nullable3 ?? default(someType);

это читабельно, согласованно, стоит использовать и узнаваемо в коде.

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

Знаете ли вы других? Я хотел бы иметь более конкретные использования: например, Asp.net, EF, LINQ, что угодно - где объединение не только приемлемо, но и замечательно.

Ответы [ 2 ]

6 голосов
/ 25 февраля 2010

Для меня то, что он переводит на SQL, само по себе достаточно хорошо:

from a in DB.Table
select new {
             a.Id,
             Val = a.One ?? a.Two ??a.Three
           }

Это приводит к COALSCE на стороне базы данных, что делает невероятно более чистый SQL в большинстве случаев, просто не существует какой-либо хорошей альтернативы. Мы используем Oracle, я бы лучше не читал, хотя Nvl(Nvl(Nvl(Nvl( вложенность спасибо ... Я возьму COALSCE и побегу с ним.

Я также использую его для таких свойств, просто для личного вкуса:

private string _str;
public string Str { 
  get { return _str ?? (_str = LoaderThingyMethod()); } 
}
4 голосов
/ 25 февраля 2010

Причина, по которой оператор нуль-слияния был введен в C # 2.0, заключалась в том, что у него был способ присваивать значения по умолчанию допускаемым для типов и, таким образом, легко преобразовывать обнуляемый тип в ненулевой. Без ?? любое преобразование потребовало бы длинного оператора if. Следующая цитата взята из MSDN :

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

Вы можете считать следующее упрощение "замечательным":

int? x = null;
int y = x ?? -1;

Вместо

int? x = null;
int y = -1;

if (x.HasValue)
{
    y = x.Value;
}
...