Общие c# идиомы включая объединяют?? оператор

Все знают, что по крайней мере две общих c# идиомы включая объединяют оператор:

одиночный элемент один:

return _staticField = _staticField ?? new SingletonConstructor();

и цепочечный:

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

это читаемо, последовательно, стоит использовать и распознаваемый в коде.

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

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

7
задан rudnev 24 February 2010 в 23:55
поделиться

2 ответа

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

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

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

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

private string _str;
public string Str { 
  get { return _str ?? (_str = LoaderThingyMethod()); } 
}
6
ответ дан 7 December 2019 в 01:19
поделиться

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

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

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

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

Вместо

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

if (x.HasValue)
{
    y = x.Value;
}
4
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: