class NullableDemo {
static void Main() {
int? count = null;
int? result = null;
int incr = 10; // переменная incr не является обнуляемой
// переменная result содержит пустое значение,
// переменная оказывается count пустой,
result = count + incr;
if(result.HasValue)
Console.WriteLine("Переменная result имеет следующее значение: "
+ result.Value);
else
Console.WriteLine("У переменной result отсутствует значение");
// Теперь переменная count получает свое значение, и поэтому
// переменная result будет содержать конкретное значение.
count = 100;
result = count + incr;
if(result.HasValue)
Console.WriteLine("Переменная result имеет следующее значение: "
+ result.Value);
else
Console.WriteLine("У переменной result отсутствует значение");
}
}
При выполнении этой программы получается следующий результат.
У переменной result отсутствует значение
Переменная result имеет следующее значение: 110
Оператор ??
Попытка преобразовать обнуляемый объект в его базовый тип путем приведения типов обычно приводит к генерированию исключения 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 GetZeroBal() {
Console. WriteLine ("В методе GetZeroBalO.");
return 0.0;
}
static void Main() {
double? balance = 123.75;
double currentBalance;
// Здесь метод GetZeroBal() не вызывается, поскольку
// переменная balance содержит конкретное значение.
currentBalance = balance ?? GetZeroBal();
Console.WriteLine(currentBalance);
}
}
В этой программе метод GetZeroBal()
не вызывается, поскольку переменная balance
содержит конкретное значение. Как пояснялось выше, если выражение в левой части оператора ??
содержит конкретное значение, то выражение в правой его части не вычисляется.
Обнуляемые объекты, операторы отношения и логические операторы