Анализатор обнаружил использование поля (свойства) до его инициализации в конструкторе класса.
Рассмотрим пример:
class Test { List<int> mylist; Test() { int count = mylist.Count; // <= .... mylist = new List<int>(); } }
В конструкторе класса 'Test' производится доступ к свойству 'Count' списка 'mylist'. При этом инициализация списка производится позже. В результате выполнения приведенного фрагмента кода произойдет доступ по нулевой ссылке. В данном случае необходимо обеспечить предварительную инициализацию списка, например, при его объявлении:
class Test { List<int> mylist = new List<int>(); Test() { int count = mylist.Count; .... } }
Рассмотрим еще один пример:
class Test2 { int myint; Test2(int param) { Foo(myint); // <= .... myint = param; } }
В данном случае в метод 'Foo' передают поле 'myint', которое имеет значение по умолчанию 0. Возможно, так и задумывалось, и ошибки нет. Однако, в некоторых случаях это может приводить к неожиданному поведению. Правильным решением будет явная инициализация поля 'myint', даже значением по умолчанию 0:
class Test2 { int myint = 0; Test2(int param) { Foo(myint); .... myint = param; } }
Теперь коллегам и анализатору очевидно, что программист не забыл про инициализацию поля 'myint'.
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3128. |