В чем разница между созданием экземпляра в конструкторе или в определении поля? - PullRequest
3 голосов
/ 01 августа 2010

Какая разница между:

public class Foo {
    private Bar bar;
    public Foo() { bar = new Bar(); }
}

и это:

public class Foo {
    private Bar bar = new Bar();
    public Foo() { }
}

Ответы [ 5 ]

9 голосов
/ 01 августа 2010

Разница в том, что во втором случае инициализация поля происходит до конструктора this / base, тогда как в первом случае инициализация происходит внутри конструктора.

6 голосов
/ 01 августа 2010

CLR не поддерживает такие поля инициализации.Чтобы заставить его работать, компилятор C # переписывает ваш конструктор.IL выглядит следующим образом:

  IL_0000:  ldarg.0
  IL_0001:  newobj     instance void ConsoleApplication1.Bar::.ctor()
  IL_0006:  stfld      class ConsoleApplication1.Bar ConsoleApplication1.Foo::bar
  IL_000b:  ldarg.0
  IL_000c:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0011:  ret

Обратите внимание, что конструктор Bar вызывается перед базовым конструктором Foo.В чем отличие от вашего другого фрагмента, там базовый конструктор Foo называется , затем .Это редко будет иметь значение, , если поле не будет унаследовано и конструктор базового класса что-то с ним сделает.

Или, если инициализаторы поля зависят друг от друга, они инициализируются в строгом текстовом порядке,Вы можете управлять порядком, выполнив его явно в конструкторе.

1 голос
/ 01 августа 2010

Немного констатирую очевидное, но при втором подходе конструктор не нужен.

0 голосов
/ 01 августа 2010

Чтобы добавить ответ Дарина Димитрова, инициализация полей в строке - это хорошая идея, если у вас есть несколько перегрузок конструктора, и вы по какой-то причине не хотите вызывать другие перегруженные конструкторы.

0 голосов
/ 01 августа 2010

Нет никакой разницы, потому что компилятор помещает все определения полей перед кодом конструктора. Так что в IL-коде оба варианта выглядят одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...