En términos de rendimiento, no hay diferencia real; los inicializadores de campo se implementan como lógica de constructor. La única diferencia es que los inicializadores de campo suceden antes que cualquier constructor "base"/"este".
El enfoque constructor se puede utilizar con propiedades auto-aplicado (inicializadores de campo pueden no) - es decir
[DefaultValue("")]
public string Foo {get;set;}
public Bar() { // ctor
Foo = "";
}
Aparte de eso, I tienden a preferir la sintaxis campo inicializador; Me parece que mantiene las cosas localizados - es decir
private readonly List<SomeClass> items = new List<SomeClass>();
public List<SomeClass> Items {get {return items;}}
que no tienen que ir a la caza de arriba a abajo para encontrar donde se le asigna ...
La excepción obvia es donde tiene que realizar la lógica compleja o tratar con parámetros de constructor, en cuyo caso la inicialización basada en el constructor es el camino a seguir. Del mismo modo, si usted tiene varios constructores, sería preferible que los campos para obtener ajuste siempre de la misma manera - por lo que podría tener ctors como:
public Bar() : this("") {}
public Bar(string foo) {Foo = foo;}
edición: como comentario al margen, tenga en cuenta que en el anterior, si hay otros campos (no se muestran) con los inicializadores de campo, entonces solo se inicializan directamente en los constructores que llaman al base(...)
, es decir, el public Bar(string foo)
ctor. El otro constructor no hace inicializadores de campo de ejecución, ya que sabe que se hacen por el this(...)
ctor.
Posible duplicado de http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at-declaration – goodeye