Ошибки и их решения

NullReferenceException в C#: причины и исправление

Обновлено: · 2 мин чтения

Ошибка NullReferenceException в C# - это один из самых частых исключений, с которыми сталкиваются разработчики в процессе работы. Это исключение возникает тогда, когда вы пытаетесь обратиться к члену объекта, который не инициализирован (т.е. равен null). Детально рассмотрим, что такое NullReferenceException, почему оно возникает и какие шаги необходимо предпринять для его устранения.

NullReferenceException в C#: причины и исправление
Содержание
  1. Что такое NullReferenceException и почему оно возникает?
    1. Пример кода с NullReferenceException
  2. Как обнаружить NullReferenceException?
    1. Пример сообщения об ошибке
  3. Предотвращение NullReferenceException
    1. Инициализация переменных
    2. Проверка на null
    3. Использование Null-conditional оператора
  4. Исправление NullReferenceException после его возникновения
    1. Исправление примера с NullReferenceException
  5. Лучшие практики работы с ссылочными типами

Что такое NullReferenceException и почему оно возникает?

NullReferenceException в C# является сигналом о том, что ваш код пытается использовать ссылку на объект, который еще не был создан или был уничтожен. В C# все переменные ссылочных типов могут принимать значение null, что означает отсутствие конкретного объекта. Проблема возникает, когда мы пытаемся вызвать метод или получить доступ к свойству объекта, который равен null.

Пример кода с NullReferenceException

public class Person
{
    public string Name { get; set; }
}

public class Program
{
    public static void Main()
    {
        Person person = null;
        Console.WriteLine(person.Name);
    }
}

В этом примере переменная person является null, поэтому попытка обратиться к свойству Name вызовет NullReferenceException.

Как обнаружить NullReferenceException?

Обнаружение NullReferenceException обычно не составляет труда, так как исключение выбрасывается в момент попытки обращения к неинициализированному объекту. Стек вызовов, который предоставляется в сообщении об ошибке, поможет точно определить место в коде, где произошло исключение.

Пример сообщения об ошибке

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at Program.Main() in C:\Projects\Example\Program.cs:line 9

Эту ошибку лучше не исправлять, а не допускать.

Предотвращение NullReferenceException

Лучший способ борьбы с NullReferenceException - предотвращение его возникновения. Для этого существует ряд подходов:

Инициализация переменных

Убедитесь, что все переменные ссылочного типа инициализированы перед их использованием.

Проверка на null

Перед обращением к свойствам или методам объекта всегда проверяйте, не равен ли он null.

if (person != null)
{
    Console.WriteLine(person.Name);
}

Использование Null-conditional оператора

В C# 6.0 и выше можно использовать ?. для безопасного обращения к членам объекта, которые могут быть null.

Console.WriteLine(person?.Name);

Исправление NullReferenceException после его возникновения

Если исключение уже произошло, необходимо проанализировать стек вызовов и понять, на каком именно объекте произошла попытка обращения. После этого следует проследить жизненный цикл этого объекта и выяснить, почему он оказался неинициализированным.

Исправление примера с NullReferenceException

public class Program
{
    public static void Main()
    {
        Person person = new Person(); // Теперь объект инициализирован
        person.Name = "Alice";
        Console.WriteLine(person.Name);
    }
}

Закрепим результат несколькими правилами для повседневной работы.

Лучшие практики работы с ссылочными типами

Для избежания подобных ошибок в будущем, следует придерживаться определенных практик при работе с ссылочными типами:

  • Используйте конструкторы для инициализации объектов.
  • Устанавливайте значения по умолчанию для свойств объектов.
  • Рассмотрите возможность использования nullable value types (Nullable<T> или T?) для типов значений, которые могут принимать null.
  • Используйте паттерн “Null Object” для предоставления стандартного поведения для неинициализированных объектов.

Следуя этим рекомендациям и понимая основные принципы работы с ссылочными типами, вы сможете значительно снизить риск возникновения NullReferenceException в вашем коде на C#.