0Pricing
C# Academy · Урок

Операторы объединения с null

Значения по умолчанию ?? и ??=.

«Операторы объединения с null» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Задание запасного значения

Часто требуется использовать значение, если оно существует, или значение по умолчанию, если оно равно null. Оператор объединения с null ?? делает именно это.

a ?? b означает: использовать a, если оно не равно null, иначе использовать b.

string input = null;
string name = input ?? "Guest";
System.Console.WriteLine(name);

Как вычисляется ??

Сначала вычисляется левая часть. Если она не равна null, правая часть вообще не вычисляется.

Благодаря такому сокращённому вычислению ресурсоёмкое запасное значение создаётся только тогда, когда оно действительно необходимо.

string cached = "data";
string value = cached ?? Compute();
System.Console.WriteLine(value);
// Compute() is never called here

Работа с типами значений, допускающими null

?? также извлекает значения из типов значений, допускающих null. Объединение int? maybe с ?? 0 даёт обычный тип int, не допускающий null.

Это удобный способ преобразовать int? в int, используя значение по умолчанию.

int? maybe = null;
int sure = maybe ?? 0;
System.Console.WriteLine(sure);

Рабочий пример

Эта программа считывает настройку, которая может быть равна null, и использует значение по умолчанию. Запустите её, чтобы увидеть запасное значение в действии.

using System;

class Program
{
    static void Main()
    {
        string theme = null;
        string active = theme ?? "light";
        Console.WriteLine("Theme: " + active);
    }
}

Объединение операторов ??

Можно объединить несколько запасных значений. Выражение выбирает первое значение, не равное null, при просмотре слева направо.

a ?? b ?? c проверяет a, затем b и наконец c как последнее средство.

string a = null;
string b = null;
string c = "default";
System.Console.WriteLine(a ?? b ?? c);

Оператор ??=

Оператор присваивания с объединением по null ??= присваивает правую часть, только если левая часть в данный момент равна null.

x ??= y — это сокращённая запись if (x == null) x = y;. Если в x уже есть значение, оно остаётся без изменений.

string config = null;
config ??= "default";
System.Console.WriteLine(config);
config ??= "ignored";
System.Console.WriteLine(config);

Отложенная инициализация с ??=

Оператор ??= часто используют для отложенной инициализации: объект создаётся только при первом обращении к нему.

При последующих вызовах поле уже задано, поэтому ??= ничего не делает.

System.Collections.Generic.List<int> items = null;
items ??= new System.Collections.Generic.List<int>();
items.Add(1);
System.Console.WriteLine(items.Count);

Сочетание ?. и ??

Сочетание ?. и ?? используется очень часто. Оператор ?. предотвращает исключение, а ?? предоставляет значение, если цепочка равна null.

user?.Name ?? "Unknown" безопасно получает имя, подставляя значение "Unknown" по умолчанию.

string s = null;
int length = s?.Length ?? -1;
System.Console.WriteLine(length);

?? в полноценной программе

Здесь ?. и ?? работают вместе, чтобы вывести длину безопасным способом. Запустите программу со строкой, равной null, чтобы увидеть запасное значение.

using System;

class Program
{
    static void Main()
    {
        string username = null;
        string display = username ?? "anonymous";
        Console.WriteLine(display);
        Console.WriteLine(username?.Length ?? 0);
    }
}

?? с возникновением исключения

Правая часть ?? может быть любым выражением, в том числе throw. Благодаря этому ?? позволяет компактно немедленно завершить выполнение при неожиданном значении null.

name ?? throw new ArgumentNullException(nameof(name)) возвращает имя или вызывает исключение, если оно равно null.

string Validate(string name) =>
    name ?? throw new System.ArgumentNullException(nameof(name));

Правоассоциативность

Оператор ?? правоассоциативен, поэтому a ?? b ?? c группируется как a ?? (b ?? c).

На практике это по-прежнему означает «первым побеждает значение, не равное null», но это полезно знать при разборе сложных выражений.

int? a = null;
int? b = null;
int result = a ?? b ?? 99;
System.Console.WriteLine(result);

Быстрая проверка

Проверьте, насколько хорошо Вы поняли операторы объединения с null.

Итоги

?? возвращает левую часть, если она не равна null, а в противном случае — правую; операторы можно объединять в цепочку. ??= выполняет присваивание, только если целевое значение равно null, поэтому идеально подходит для отложенной инициализации.

Сочетайте эти операторы с ?. для безопасной и лаконичной обработки значений null и даже используйте ?? throw для немедленного завершения при ошибке.

Часто задаваемые вопросы

Урок «Операторы объединения с null» бесплатный?

Да — полный текст урока «Операторы объединения с null» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Операторы объединения с null»?

Значения по умолчанию ?? и ??=. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Операторы объединения с null»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Типы значений, допускающие null
  2. Оператор проверки на null
  3. Операторы объединения с null
  4. Защита от null
← Назад к C# Academy