Nullable-типы в C#: безопасная работа со значениями null
Что такое nullable-типы
Nullable-типы (nullable value types) позволяют значимым типам (value types) принимать значение null в дополнение к своим обычным значениям. Обычные значимые типы (int, bool, double, структуры) не могут быть null.
Синтаксис
<тип>? <имя_переменной> = null;
// или
Nullable<<тип>> <имя_переменной> = null;
T? — это сокращение для Nullable<T>, где T — значимый тип.
Примеры объявления
int? num1 = null;
int? num2 = 45;
double? num3 = new double?(); // null
double? num4 = 3.14157;
bool? boolVal = new bool?(); // null
bool? flag = true;
Свойства Nullable<T>
| Свойство | Описание |
|---|---|
HasValue | true, если значение не null |
Value | Возвращает значение (бросает исключение, если HasValue == false) |
int? x = 5;
if (x.HasValue) Console.WriteLine(x.Value); // 5
int? y = null;
Console.WriteLine(y.HasValue); // False
// Console.WriteLine(y.Value); // InvalidOperationException
Оператор null-коалесценции (??)
Возвращает левый операнд, если он не null; иначе — правый.
double? num1 = null;
double? num2 = 3.14157;
double num3 = num1 ?? 5.34; // 5.34 (num1 == null)
double num4 = num2 ?? 5.34; // 3.14157 (num2 != null)
Также работает с ссылочными типами: string s = null ?? "default"; // "default"
Оператор ??= (C# 8.0+) — присваивание при null
string? name = null;
name ??= "Аноним"; // name становится "Аноним"
name ??= "Другой"; // не изменится, уже не null
Оператор ?. (null-conditional) — безопасный доступ
string? text = null;
int? length = text?.Length; // null, без исключения
// Цепочка:
var city = person?.Address?.City?.ToUpper();
Упаковка (boxing) nullable-типов
- Если
HasValue == true— упаковывается базовое значение (int,doubleи т.д.) - Если
HasValue == false— упаковываетсяnull(не экземпляр Nullable)
int? x = 42;
object o = x; // упаковка int (не Nullable<int>)
Console.WriteLine(o.GetType()); // System.Int32
int? y = null;
object o2 = y; // упаковка null
Console.WriteLine(o2 == null); // True
Nullable-типы и операторы
- Арифметические/сравнения: если один операнд null — результат null (кроме
==/!=) int? a = 5, b = null; a + b → nulla == b → false,a != b → true,null == null → true
Nullable-контекст (C# 8.0+)
Включается в проекте (<Nullable>enable</Nullable>) или директивой #nullable enable. Компилятор выдаёт предупреждения при возможном разыменовании null для ссылочных типов.
#nullable enable
string? maybeNull = null;
string notNull = "text";
// maybeNull.Length; // Warning!
// notNull.Length; // OK
Язык C
- Освоение Java 8 Optional: Практическое руководство по коду, безопасному для null
- Атрибуты в C#: метаданные, предопределённые и пользовательские атрибуты
- Ferro-Titanit® Cromoni — высокопрочный неметаллический титановый сплав
- Сплав AgCu20: Механические, тепловые и электрические свойства при 23 °C
- Сплав 15CDV6 (DIN 1.7734): Высокая прочность, вязкость и легкая сварка
- Сплав DIN 1.7734 (15CDV6): Высокая прочность, вязкость и свариваемость
- Сплав 15CDV6 (DIN 1.7734): Высокая прочность, легкая сварка, превосходная вязкость
- Сплав PtNi10 – Комплексные механические и тепловые свойства
- Сплав PtIr10 платина-иридий: высокопрочный материал для высоких температур
- Лист Corroplast – Коррозионно-стойкая сталь для точной обработки и формообразования