# V3128. The field (property) is used before it is initialized in constructor.

Анализатор обнаружил использование поля (свойства) до его инициализации в конструкторе класса.

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

    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'.

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

CWE-665

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3128.