Значение null. Типы данных, допускающих значение null. Операции ?, ??
Содержание
- 1. Значение null. Присваивание
- 2. Синтаксис типа данных, допускающих значение null. Суффикс ?
- 3. Примеры использования значений null в переменных базовых типов
- 4. Суффикс ? и структура System.Nullable<T>. Назначение. Пример
- 5. Как программно определить, было ли присвоено null-значение Nullable-переменной?
- 6. Операция ?? (null-coalescing). Назначение. Пример
- Связанные темы
Поиск на других ресурсах:
1. Значение null. Присваивание
Значение null используется для представления пустой ссылки на объект. Это значение может быть присвоено переменным ссылочных типов.
Пример.
В примере продемонстрировано присваивание null-значениий ссылкам на объекты классов CMyClass и string. Если попробовать присвоить значение null переменной типа int, то компилятор выдаст сообщение об ошибке.
class CMyClass { public int value; } class Program { static void Main(string[] args) { CMyClass obj; obj = null; // пустая ссылка на объект класса CMyClass string s = null; // пустая ссылка на строку // int d = null; - ошибка: тип int не является null-типом Console.ReadKey(); } }
⇑
2. Синтаксис типа данных, допускающих значение null. Суффикс ?
В языке программирования C# все базовые числовые типы данных (int, float, double, bool и прочие) есть типами-значениями. Этим типам никогда не может быть присвоено значение null. Значение null может присваиваться переменным ссылочных типов таким как классы.
Существуют случаи, когда нужно чтобы тип-значение допускал null. Например, в таблицах баз данных при некоторых условиях могут быть поля, которые содержат неопределенные null-значения.
Для того, чтобы тип-значение мог поддерживать null, в C# используется следующая общая форма, которая содержит символ ?
type? variable;
где
- type – тип-значение, который должен допускать значение null;
- variable – название переменной, которой может быть присвоено значение null.
⇑
3. Примеры использования значений null в переменных базовых типов
... // Nullable-типы // Это ошибка // int d = null; // ошибка - d не есть Nullable-тип // Так работает int? d2 = null; double? x; x = 25; x = null; bool? b; b = true; b = null; float? f; f = null; ...
⇑
4. Суффикс ? и структура System.Nullable<T>. Назначение. Пример
Если компилятор после имени типа встречает суффикс ?, то он создает экземпляр обобщенной структуры System.Nullable<T>.
Структура System.Nullable<T> обеспечивает дополнительный набор средств, которые работают с типами, допускающими значение null. К этим средствам можно отнести:
- свойство HasValue. Это свойство определяет, имеет ли текущий объект типа System.Nullable<T> стойкое значение типа T (здесь вместо типа T задается любой базовый тип int, double и т.д.). Свойство возвращает true, если текущий объект имеет такое значение, в противном случае возвращается false (см. пример ниже). Иными словами, свойство HasValue возвращает false, если значение объекта равно null;
- свойство Value – возвращает текущее значение, которое присвоено переменной типа, допускающей null;
- метод GetValueOrDefault(). Если Nullable-переменная имеет значение не равное null, то этот метод возвращает это значение. Если Nullable-переменная равна null, то метод возвращает значение по умолчанию (как правило это 0). Этот метод нужно использовать для корректного присваивания значения из Nullable-типа в обычный базовый тип.
Пример.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 { class Program { static void Main(string[] args) { // 1. Объявление переменной типа System.Nullable<int> System.Nullable<int> d; // можно было и так: int? d; // 2. Объявление переменной типа System.Nullable<double> double? t = null; // 3. Свойство Value - демонстрация правильного присваивания // тип int? d = null; int d2; // не Nullable-тип if (d == null) d2 = 0; else d2 = d.Value; // d2 = 335 // тип double? t = -10.55; double t2; if (t != null) t2 = t.Value; // t2 = -10.55 else t2 = 0.0; // 4. Свойство HasValue // Проверка, равна ли переменная t значению null t = null; if (t.HasValue) Console.WriteLine("t != null"); else Console.WriteLine("t == null"); // 5. Метод GetValueOrDefault() - не нужно делать проверку на null t = null; double t3 = t.GetValueOrDefault(); // t3 = 0 - значение по умолчанию Console.WriteLine("d2 = {0}", d2); Console.WriteLine("t2 = {0}", t2); Console.WriteLine("t3 = {0}", t3); Console.ReadKey(); } } }
Результат выполнения программы
t == null d2 = 0 t2 = -10.55 t3 = 0
⇑
5. Как программно определить, было ли присвоено null-значение Nullable-переменной?
Если переменная допускает null, то определить, содержит ли эта переменная значение null можно следующими способами:
- использовать одну из операций == или !=;
- использовать свойство HasValue.
Пример.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 { class Program { static void Main(string[] args) { // Проверка, было ли присвоено null-значение Nullable-переменной char? symbol; // некоторая Nullable-переменная // Способ 1. Операция == symbol = null; if (symbol == null) Console.WriteLine("symbol == null"); else Console.WriteLine("symbol != null"); // Способ 2. Операция != symbol = 'a'; if (symbol != null) Console.WriteLine("symbol != null"); else Console.WriteLine("symbol == null"); // Способ 3. Свойство HasValue symbol = null; if (symbol.HasValue) Console.WriteLine("symbol != null"); else Console.WriteLine("symbol == null"); Console.ReadKey(); } } }
Результат работы программы
symbol == null symbol != null symbol == null
⇑
6. Операция ?? (null-coalescing). Назначение. Пример
Операция ?? позволяет присваивать объекту Nullable-типа заданное значение в случае, если значение этого объекта равно null. Операция позволяет заменить программный код, который использует конструкцию if-else. По сравнение if-else эта операция есть более компактной.
Пример.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 { class Program { static void Main(string[] args) { // Операция ?? uint? d; // некоторый Nullable-тип uint? t; d = null; t = d ?? 50; // t = 50 Console.WriteLine("t = {0}", t); d = 20; t = d ?? 50; // t = 20 Console.WriteLine("t = {0}", t); Console.ReadKey(); } } }
Результат работы программы
t = 50 t = 20
⇑
Связанные темы
- Ресурс Microsoft
- Категории (группы) типов данных в C#. Значимые типы. Ссылочные типы
- Базовые типы данных языка C#
⇑