Например, в приведенном ниже фрагменте кода переменная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содержит конкретное значение. Как пояснялось выше, если выражение в левой части оператора ? ? содержит конкретное значение, то выражение в правой его части не вычисляется.
Обнуляемые объекты, операторы отношения и логические операторы
Обнуляемые объекты могут использоваться в выражениях отношения таким же образом, как и соответствующие объекты необнуляемого типа. Но они должны подчиняться следующему дополнительному правилу: когда два обнуляемых объекта сравниваются в операциях сравнения <, >, <= или >=, то их результат будет ложным, если любой из обнуляемых объектов оказывается пустым, т.е. содержит значениеnull.В качестве примера рассмотрим следующий фрагмент кода.
byte? lower = 16; byte? upper = null;
// Здесь переменная lower определена, а переменная upper не определена, if(lower < upper) // ложно%
В данном случае проверка того, что значение одной переменой меньше значения другой, дает ложный результат. Хотя это и не совсем очевидно, как, впрочем, и следующая проверка противоположного характера.
if(lower > upper) // .. также ложно!
Следовательно, если один или оба сравниваемых обнуляемых объекта оказываются пустыми, то результат их сравнения всегда будет ложным. Это фактически означает, что пустое значение (null) не участвует в отношении порядка.