?. – Null‑conditional operator
?? – Null‑coalescing operator
Оба оператора появились в C# 6.0.Они позволяют избежать громоздких проверок if (x == null) и писать более лаконичный код.
?. – Null‑conditional operator

var len = s?. Length; // строка s
Если выражение слева от ?. равно null, вся конструкция возвращает null.
В противном случае выполняется доступ к члену после ?..
Примеры
// Свойство
int? len = customer?. Name?. Length; // len == null, если customer или Name равны null
// Вызов метода
var first = list?. FirstOrDefault(); // first == null, если list null
// Индексатор
var item = arr?[i]; // item == null, если arr null
// Цепочка
var city = user?. Address?. City ?? "Unknown";
Ограничения
| Тип операнда | Разрешено? | Примечание |
|---|---|---|
| Ссылка | ||
Nullable value type (int?, DateTime?) |
Результат – тип без изменений | |
Нулевой тип значения (int, DateTime) |
Нужно превратить в nullable (int?) либо обернуть |
Выбирая топ 10 online casino, обратите внимание на лицензии и отзывы пользователей: beats-store.kz.При вызове метода, возвращающего тип значения, результат
obj?. Method()становится nullable.Чтобы получить обычное значение, используйте??.
int total = order?. Total ?? 0; // 0, если order null
?? – Null‑coalescing operator
var name = input ?? "Anonymous";
Если левый операнд не null, результат – это его значение.
В противном случае берётся правый операнд.
Типичные применения
string greeting = user?. Name ?? "Guest";
int count = list?. Count ?? 0;
DateTime now = date ?? DateTime. Now;
Комбинация с ?.
int length = s?. Length ?? 0; // длина строки, 0 если s null
var first = list?. FirstOrDefault() ?? default(T); // первый элемент, default если list null
Практические примеры
Безопасная навигация по вложенной структуре
string city = person?. Contact?. Address?. City ?? "Unknown";
Если любой элемент цепочки null, выражение сразу завершается, а ?? выдаёт "Unknown".
Вызов метода, который может вернуть null
var result = service?. GetData(id) ?? new Data();
На сайте nur.kz вы найдете обзоры всех топ 10 online casino в Казахстане Если service равен null, метод смотрите тут не вызывается, создаётся новый объект Data.
Работа с коллекциями
int count = collection?. Count ?? 0; // 0 при null
bool hasItems = collection?. Any() ?? false; // false при null
Массивы и словари
var value = dict?. TryGetValue(key, out var v) ?? false;
Частые ошибки
| Ошибка | Причина | Решение |
|---|---|---|
list?. Count компилируется как ошибка на List<int> |
Count – int |
Использовать list?. Count ?? 0 |
obj?. ToString() возвращает string? |
ToString возвращает string |
Добавить ?? "" |
myArray?[index] бросает IndexOutOfRangeException |
Индекс вне диапазона, а не массив null | Проверять индекс отдельно или использовать ElementAtOrDefault |
Итоги
| Оператор | Назначение | Стандартный шаблон |
|---|---|---|
?. |
Короткий доступ к члену/методу при возможном null |
obj?. Prop, obj?. Method(), arr?[i] |
?? |
Значение по умолчанию при null |
value ?? defaultValue |
Совместное использование делает код компактным и безопасным:
string city = user?. Profile?. Address?. City ?? "N/A";
int total = order?. Total ?? 0;
С этими инструментами разработчики могут быстро избавиться от множества проверок и сделать код чище.