V3105. The 'a' variable was used after it was assigned through null-conditional operator. NullReferenceException is possible.
Данная диагностика предупреждает вас о возможном возникновении 'NullReferenceException' при выполнении программы. Предупреждение возникает в том случае, если происходит обращение к полю переменной без проверки её на 'null'. Ключевым моментом является то, что значение переменной вычисляется с помощью выражения, где используется оператор Null-conditional.
Рассмотрим пример:
public int Foo (Person person)
{
string parentName = person?.Parent.ToString();
return parentName.Length;
}
В данном случае при инициализации объекта 'parentName' мы предполагаем, что 'person' может быть 'null'. В таком случае функция 'ToString()' не будет выполнена, а в переменную 'parentName' запишется 'null'. При попытке чтения свойства 'Length' из переменной 'parentName' возникнет исключение 'NullReferenceException'.
Исправленный код функции может быть следующим:
public int Foo (Person person)
{
string parentName = person?.Parent.ToString();
return parentName?.Length ?? 0;
}
Теперь, если в переменной 'parentName' не было 'null', то мы вернем длину строки, а если был 'null', то 0.
Следующий пример:
void DoSomething(string[] args)
{
var nonNullStrings = args?.Where(arg => arg != null);
foreach (var str in nonNullStrings)
....
}
Аналогично предыдущему примеру, здесь при инициализации 'nonNullStrings' предполагается, что параметр 'args' может иметь значение 'null'. В таком случае в переменную 'nonNullStrings' также будет записан 'null'. При переборе элементов коллекции в 'foreach' у 'nonNullStrings' будет неявно вызван метод 'GetEnumerator()'. Этот вызов приведет к возникновению исключения типа 'NullReferenceException', если 'nonNullStrings' будет иметь значение 'null'.
Исправленный вариант кода может быть таким:
void DoSomething(string[] args)
{
var nonNullStrings = args?.Where(arg => arg != null)
?? Enumerable.Empty<string>();
foreach (var str in nonNullStrings)
....
}
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3105. |