С точки зрения производительности реальной разницы нет; Инициализаторы полей реализованы как логика конструктора. Единственная разница в том, что инициализаторы полей выполняются перед любым конструктором "base" / "this".
Подход конструктора может использоваться с автоматически реализуемыми свойствами (инициализаторы полей не могут), т.е.
[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;}
edit: в качестве дополнительного комментария обратите внимание, что в приведенном выше примере, если есть другие поля (не показаны) с инициализаторами полей, то они инициализируются напрямую только в конструкторах, которые вызывают base(...), то есть public Bar(string foo) ctor. Другой конструктор не запускает инициализаторы полей, поскольку знает, что они выполняются this(...) ctor.
person
Marc Gravell
schedule
18.11.2008