Типы значений, допускающие null
int? и структура Nullable.
«Типы значений, допускающие 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 — локальная установка не требуется.
Все уроки этого курса
- Типы значений, допускающие null
- Оператор проверки на null
- Операторы объединения с null
- Защита от null