Защита от null
Проверка данных и шаблоны.
«Защита от null» — бесплатный урок C# Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Зачем проверять значения null
Метод, получивший неожиданное значение null, часто завершается позже с непонятным исключением NullReferenceException где-то глубоко в стеке вызовов.
Проверка на null означает проверку аргументов в самом начале и понятное завершение работы, чтобы ошибка сразу указывала на настоящую причину.
Классическая проверка на null
Самая простая проверка — явная проверка, которая вызывает ArgumentNullException, если обязательный аргумент равен null.
Так Вы проверяете входные данные на границе метода, до начала любой работы.
void Save(string path)
{
if (path == null)
throw new System.ArgumentNullException(nameof(path));
System.Console.WriteLine(path);
}Использование nameof
Передавайте nameof(path), а не строку, записанную напрямую. Тогда исключение укажет точное имя параметра, и имя останется правильным, если Вы переименуете параметр.
Это значительно упрощает отладку, когда исключение записывается в журнал.
void Greet(string user)
{
if (user is null)
throw new System.ArgumentNullException(nameof(user));
System.Console.WriteLine("Hi " + user);
}Вспомогательный метод ThrowIfNull
Современный C# предоставляет ArgumentNullException.ThrowIfNull(arg). Он проверяет значение на null и автоматически вызывает исключение с правильным именем параметра.
Это лаконичный и предпочтительный стиль проверки в современном коде .NET.
void Process(object data)
{
System.ArgumentNullException.ThrowIfNull(data);
System.Console.WriteLine("Processing");
}Рабочая проверка
Эта программа показывает, как проверка обнаруживает аргумент со значением null и корректно сообщает о проблеме вместо более позднего сбоя.
Запустите её, чтобы увидеть сообщение исключения с именем некорректного параметра.
using System;
class Program
{
static void Print(string text)
{
ArgumentNullException.ThrowIfNull(text);
Console.WriteLine(text);
}
static void Main()
{
try { Print(null); }
catch (ArgumentNullException ex) { Console.WriteLine(ex.ParamName); }
}
}Проверка с помощью ?? throw
Можно объединить присваивание и проверку, используя ?? вместе с throw. Так Вы проверяете значение и сохраняете его в одной строке.
Это популярный шаблон в конструкторах при присваивании значения полю.
class Service
{
private readonly string _name;
public Service(string name)
=> _name = name ?? throw new System.ArgumentNullException(nameof(name));
}Пустое значение и null
Для строк значения null и пустая строка — разные проблемы. Используйте string.IsNullOrEmpty или string.IsNullOrWhiteSpace, чтобы одновременно обнаружить оба случая.
Для пустого, но не равного null значения подходит ArgumentException, а не ArgumentNullException.
void SetName(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new System.ArgumentException("Name required", nameof(name));
}Проверка с помощью шаблонов
Шаблоны is null и is not null легко читаются, и их нельзя обмануть перегруженными операторами равенства.
Предпочитайте is null выражению == null, если тип может переопределять оператор ==.
object value = null;
if (value is null)
System.Console.WriteLine("It is null");
if (value is not null)
System.Console.WriteLine("Has value");Значение по умолчанию вместо исключения
Не каждое значение null является ошибкой. Иногда разумное значение по умолчанию лучше, чем исключение.
Используйте ??, когда значение null допустимо, и вызывайте исключение только тогда, когда значение действительно обязательно.
string BuildPath(string folder)
{
folder ??= "/tmp";
return folder + "/file.txt";
}Польза ссылочных типов, допускающих null
Если ссылочные типы, допускающие null, включены, компилятор предупреждает о возможном обращении к значению, которое может быть равно null, и обнаруживает ошибки до выполнения программы.
Объявление string (не допускает null) вместо string? (допускает null) документирует Ваш замысел и помогает анализатору.
#nullable enable
string required = "ok";
string? optional = null;
System.Console.WriteLine(optional?.Length ?? 0);Проверка и безопасное использование
После проверки в начале метода остальная часть тела может использовать значение без повторяющихся проверок на null.
Эта программа сначала выполняет проверку, а затем уверенно использует аргумент.
using System;
class Program
{
static int Length(string s)
{
ArgumentNullException.ThrowIfNull(s);
return s.Length;
}
static void Main()
{
Console.WriteLine(Length("hello"));
}
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли проверку на null.
Итоги
Проверяйте обязательные аргументы в начале метода. Используйте ArgumentNullException.ThrowIfNull или ?? throw вместе с nameof, чтобы получать понятные ошибки.
Используйте string.IsNullOrWhiteSpace для пустых строк, шаблоны is null для безопасных проверок и ??, когда вместо завершения с ошибкой допустимо значение по умолчанию.
Часто задаваемые вопросы
Урок «Защита от null» бесплатный?
Да — полный текст урока «Защита от null» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Защита от null»?
Проверка данных и шаблоны. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Защита от null»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.