С точки зрения производительности, нет никакой реальной разницы; Инициализаторы полей реализуются как логика конструктора. Единственное различие заключается в том, что инициализаторы поля происходят до любого «базового»/«этого» конструктора.
Конструктора подход может быть использован с автоматическими Реализуемыми свойствами (поле инициализаторы не могу) - т.е.
[DefaultValue("")]
public string Foo {get;set;}
public Bar() { // ctor
Foo = "";
}
Кроме этого, я, как правило, предпочитает синтаксис поле инициализатора; Я считаю, что держит вещи локализованы - т.е.
private readonly List<SomeClass> items = new List<SomeClass>();
public List<SomeClass> Items {get {return items;}}
Я не должен идти на охоту вверх и вниз, чтобы найти, где он назначен ...
Очевидное исключение, где необходимо выполнить сложную логику или обрабатывать параметры конструктора - в этом случае инициализация на основе конструктора - это путь. Точно так же, если у вас есть несколько конструкторов, было бы предпочтительнее для полей всегда получить набор точно так же - так что вы можете иметь ctors как:
public Bar() : this("") {}
public Bar(string foo) {Foo = foo;}
редактировать: как побочный комментарий, обратите внимание, что в приведенном выше, если есть другие поля (не показаны) с инициализаторами поля, то они только непосредственно инициализируются в конструкторах, которые вызывают base(...)
, то есть public Bar(string foo)
ctor. Другой конструктор делает не инициализаторы полей, так как он знает, что они сделаны this(...)
ctor.
Возможный дубликат http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at-declaration – goodeye 2013-03-03 03:10:53