В чем разница между инициализацией полей в конструкторе и за ним?

ReasonX7

То есть, в чем состоит разница между следующим кодом?
class SomeClass
{
  List<int> someList = new List<int>();
}
и
class SomeClass
{
  List<int> someList;
 
  public SomeClass()
  {
    someList = new List<int>();
  }
}
5 ответов

ReasonX7

разница в доступе к полям
class SomeClass
{
    List<int> someList;
    public SomeClass()
    {
        someList = new List<int>();
    }
}
здесь пока не сработает функция SomeClass List объявлен но не чего не присвоено. Как например
int i; // значение null
i=10; // 10
int i=10;// значение 10


ReasonX7

ReasonX7, разницы никакой нет, всё в итоге скомпилируется в один и тот же код, только в первом случае CLR создаст за вас пустой конструктор и инициализирует в нём все переменные (если конструктор уже имеется, то вся инициализация, описанная выше конструктора будет проведена в нём же). Но в общем и целом разницы не какой. Однако стоит помнить, что при инициализации полей класса вне конструктора у вас нет возможности записать в них значение, переданное в конструктор в качестве аргумента, значения всегда будут одни и те же.


ReasonX7

Однако стоит помнить, что при инициализации полей класса вне конструктора у вас нет возможности записать в них значение, переданное в конструктор в качестве аргумента, значения всегда будут одни и те же.
Что то вы батенька привираете, пример пожалуйста.
То есть, в чем состоит разница между следующим кодом?
Разница в том, что в первом случае переменная someList, будет проинициализирована всегда при вызове любого конструктора (за исключением статического), а во втором случае, переменная someList будет проинициализирована только в том конструкторе где вы ее проинициализируете, если будет еще один конструктор и в нем вы про нее забудете, тогда она будет равна null.


ReasonX7

Grishaco, имею в виду что если нет конструктора, то значение после инициализации будет всегда тем, которое написано в коде:
class SomeClass
{
  List<int> someList = new List<int>();
}
А если есть конструктор мы можем в нём присвоить то, которое передали в качестве аргумента
class SomeClass
{
  List<int> someList;
 
  public SomeClass(List<int> someList)
  {
    this.someList = someList;
  }
}
Безусловно потом мы можем в обоих случаях записать в поле всё что угодно.


ReasonX7

Разница в том, что в первом случае список будет создан до вызова конструктора, а во втором случае он будет вызван во время вызова конструктора, то есть на момент вызова будет null.В вашем конкретном примере разницы никакой, так как класс очень прост. Но если добавляется наследование или вызовы методов из конструктора, то место инициализации поля может существенно повлиять на поведение объекта.