Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V3100. NullReferenceException is...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V3100. NullReferenceException is possible. Unhandled exceptions in destructor lead to termination of runtime.

17 Май 2016

Анализатор обнаружил код, который может привести к возникновению исключения NullReferenceException в деструкторе (финализаторе) класса.

Тело деструктора класса является критичным местом в программе. Начиная с версии .NET 2.0, возникновения неперехваченного исключения в теле деструктора приводит к полной остановке программы. Перехватить исключение, выпущенное из деструктора, в дальнейшем невозможно.

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

Рассмотрим пример:

class A
{
  public List<int> numbers { get; set; }
  ~A()
  {
    if (numbers.Count > 0) { 
      ....
    }
  }
}

Т.к. изначально коллекция 'numbers' не была проинициализирована при объявлении, мы не можем утверждать, что при финализации объекта класса 'A', поле 'numbers' будет содержать ссылку на объект. Поэтому, стоит дополнительно проверить коллекцию на null, либо обернуть обращение к полю в блок try/catch.

Безопасный вариант кода может выглядеть следующим образом:

~A()
{
  if (numbers != null)
  {
    if (numbers.Count > 0)
    {
       ....
    }
  }
}

Начиная с версии языка C# 6.0, с помощью оператора '?.', можно сократить проверку до:

~A()
{
  if (numbers?.Count > 0) { 
    ....
  }
}

Данная диагностика классифицируется как: