Книга: C# 4.0: полное руководство
Оператор ??
Оператор ??
Попытка преобразовать обнуляемый объект в его базовый тип путем приведения типов обычно приводит к генерированию исключения 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
содержит конкретное значение. Как пояснялось выше, если выражение в левой части оператора ??
содержит конкретное значение, то выражение в правой его части не вычисляется.
- Небезопасный код
- Обнуляемые типы
- Основы применения обнуляемых типов
- Применение обнуляемых объектов в выражениях
- Оператор ??
- Обнуляемые объекты, операторы отношения и логические операторы
- Частичные типы
- Частичные методы
- Создание объектов динамического типа
- Возможность взаимодействия с моделью СОМ
- Дружественные сборки
- Разные ключевые слова
- Арифметические операторы
- 1.2.4. Операторы и приоритеты
- Условные операторы
- 1. Оператор Select – базовый оператор языка структурированных запросов
- Поразрядные операторы
- Оператор цикла foreach
- Логические операторы
- Оператор goto
- A7.11. Оператор побитового И
- Использование операторов if для выбора вариантов
- 2.1.3. Оператор варианта (переключатель)
- Оператор цикла for