V3100. NullReferenceException is possible. Unhandled exceptions in destructor lead to termination of runtime.
Анализатор обнаружил код, который может привести к возникновению исключения 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) {
....
}
}
Данная диагностика классифицируется как: