Попытка преобразовать обнуляемый объект в его базовый тип путем приведения типов обычно приводит к генерированию исключенияSystem. InvalidOperationException,если обнуляемый объект содержит пустое значение. Это может произойти, например, в том случае, если значение обнуляемого объекта присваивается переменной его базового типа с помощью приведения типов. Появления данного исключения можно избежать, если воспользоваться оператором ? ?, называемымнулеобъединяющим оператором.Этот оператор позволяет указать значение, которое будет использоваться по умолчанию, если обнуляемый объект содержит пустое значение. Он также исключает потребность в приведении типов.

Ниже приведена общая форма оператора ??.

обнуляемый_объект??значение_по_умолчанию

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

Например, в приведенном ниже фрагменте кода переменнаяbalanceсодержит пустое значение. Вследствие этого переменнойcurrentBalanceприсваивается значение 0 . 0, используемое по умолчанию, и тем самым устраняется причина для генерирования исключения.

double? balance = null; double currentBalance;

currentBalance = balance ?? 0.0;

В следующем фрагменте кода переменнойbalanceприсваивается значение123.75.

double? balance = 123.75; double currentBalance;

currentBalance = balance ?? 0.0;

Теперь переменнаяcurrentBalanceсодержит значение123.75переменнойbalance.

И еще одно замечание: выражение в правой части оператора ? ? вычисляется только в том случае, если выражение в левой его части не содержит значение. Этот факт демонстрируется в приведенной ниже программе.

// Применение оператора ??

using System;

class NullableDemo2 {

// Возвратить нулевой остаток, static double GetZeroBalO {

Console. WriteLine ("В методе GetZeroBalO."); return 0.0;

}

static void Main()    {

double? balance = 123.75; double currentBalance;

// Здесь метод GetZeroBalO не вызывается, поскольку // переменная balance содержит конкретное значение. currentBalance = balance ?? GetZeroBalO;

Console.WriteLine(currentBalance);

}

}

В этой программе методGetZeroBal() не вызывается, поскольку переменнаяbalanceсодержит конкретное значение. Как пояснялось выше, если выражение в левой части оператора ? ? содержит конкретное значение, то выражение в правой его части не вычисляется.

Обнуляемые объекты, операторы отношения и логические операторы

Перейти на страницу:

Похожие книги