C# Academy · Урок

Типы значений, допускающие null

int? и структура Nullable.

Урок 1 из 413 шагов

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

Зачем нужны типы значений, допускающие null

Типы значений, такие как int, bool и DateTime, всегда содержат значение. Для int значением по умолчанию является 0, а состояния «нет значения» не бывает.

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

Объявление с типом int?

Добавьте ? после типа значения, чтобы сделать его допускающим null. int? может содержать любое целое число или null.

Так чаще всего записывают типы значений, допускающие null, в повседневном коде на C#.

int? age = null;
int count = 5;
age = count;
System.Console.WriteLine(age);

Как устроен Nullable<T>

Синтаксис ? является сокращённой записью. int? — в точности тот же тип, что и Nullable<int>.

Nullable<T> — это структура, которая оборачивает тип значения и добавляет флаг, отслеживающий наличие значения.

Nullable<int> a = 10;
int? b = 10;
System.Console.WriteLine(a == b);

HasValue и Value

У каждого допускающего null типа есть два свойства. HasValue равно true, когда значение присутствует, а Value возвращает исходное значение.

Чтение Value, когда HasValue равно false, выдаёт InvalidOperationException, поэтому сначала выполните проверку.

int? score = 42;
if (score.HasValue)
{
    System.Console.WriteLine(score.Value);
}

Полный пример

Перед вами полная программа. Она присваивает значение, проверяет HasValue и выводит результат.

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

using System;

class Program
{
    static void Main()
    {
        int? temperature = 21;
        if (temperature.HasValue)
            Console.WriteLine("Temp: " + temperature.Value);
        else
            Console.WriteLine("No reading");
    }
}

Когда значение равно null

Присваивание null приводит к тому, что HasValue возвращает false. Затем выполняется ветвь else.

Так безопасно обрабатываются необязательные значения без аварийного завершения программы.

using System;

class Program
{
    static void Main()
    {
        int? temperature = null;
        if (temperature.HasValue)
            Console.WriteLine(temperature.Value);
        else
            Console.WriteLine("No reading");
    }
}

GetValueOrDefault

GetValueOrDefault() возвращает значение, если оно присутствует, а в противном случае — значение по умолчанию для этого типа (например, 0 для int).

Можно также передать собственное запасное значение: GetValueOrDefault(100) возвращает 100, если значение равно null.

int? quantity = null;
int result = quantity.GetValueOrDefault(100);
System.Console.WriteLine(result);

Неявное преобразование в тип, допускающий null

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

Обратное преобразование не выполняется автоматически: для перехода от int? к int требуется явное приведение или запасное значение, поскольку значение, допускающее null, может быть равно null.

int plain = 7;
int? wrapped = plain;
int back = (int)wrapped;
System.Console.WriteLine(back);

Типы значений, допускающие null

Подходит любой тип значения: bool?, double?, DateTime? и даже пользовательские структуры.

У типа bool? есть три состояния: true, false и null. Это удобно для вопросов, на которые ещё не дан ответ «да» или «нет.

bool? agreed = null;
double? price = 9.99;
System.Console.WriteLine(agreed.HasValue);
System.Console.WriteLine(price.Value);

Ссылочные типы уже допускают null

Классы вроде string и массивы уже могут иметь значение null, поэтому им не нужна оболочка Nullable<T>.

Знак ? у ссылочных типов (например, string?) означает другое: это аннотация ссылочного типа, допускающего null, а не структура Nullable<T>.

Сравнение значений, допускающих null

Сравнения работают, но помните, что значение null обрабатывается особым образом. Два значения null считаются равными, а любое упорядоченное сравнение со значением null возвращает false.

Поэтому null < 5 даёт результат false, и null > 5 также даёт результат false.

int? x = null;
System.Console.WriteLine(x < 5);
System.Console.WriteLine(x == null);

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

Проверьте, насколько хорошо Вы поняли типы значений, допускающие null.

Итоги

Типы значений, допускающие null, позволяют типам значений также хранить null. Записывайте их как int?, что эквивалентно Nullable<int>.

Используйте HasValue для проверки, Value для чтения (только если значение присутствует), а GetValueOrDefault() — для безопасного запасного значения. Ссылочные типы уже самостоятельно допускают null.

Можно начать бесплатно

Изучай C# с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
93
Уроки
346

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

Урок «Типы значений, допускающие null» бесплатный?

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

Чему я научусь в уроке «Типы значений, допускающие null»?

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

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

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

Сколько времени занимает урок «Типы значений, допускающие null»?

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

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

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

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

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