Чтение онлайн

ЖАНРЫ

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

// Использовать обнуляемые объекты в выражениях.

using System;

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 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) не участвует в отношении порядка.

Тем не менее с помощью операторов == и ! = можно проверить, содержит ли обнуляемый объект пустое значение. Например, следующая проверка вполне допустима и дает истинный результат.

if(upper == null) // ...

Если в логическом выражении участвуют два объекта типа bool?, то его результат может иметь одно из трех следующих значений: true (истинное), false (ложное) или null (неопределенное). Ниже приведены результаты применения логических операторов & и | к объектам типа bool?.

р

Q

P 1 Q

P&Q

true

null

true

null

false

null

null

false

null

true

Поделиться с друзьями: