Inicializando propiedades automáticas de C# [duplicado]

Resuelto dlamblin asked hace 15 años • 4 respuestas

Estoy acostumbrado a escribir clases como esta:

public class foo {
  private string mBar = "bar";
  public string Bar {
    get { return mBar; }
    set { mBar = value; }
  }
  //... other methods, no constructor ...
}

Convertir Bar en una propiedad automática parece conveniente y conciso, pero ¿cómo puedo conservar la inicialización sin agregar un constructor y colocar la inicialización allí?

public class foo2theRevengeOfFoo {
  //private string mBar = "bar";
  public string Bar { get; set; }
  //... other methods, no constructor ...
  //behavior has changed.
}

Se puede ver que agregar un constructor no está en línea con el ahorro de esfuerzo que se supone que debo obtener de las propiedades automáticas.

Algo como esto tendría más sentido para mí:

public string Bar { get; set; } = "bar";
dlamblin avatar Oct 04 '08 05:10 dlamblin
Aceptado

Actualización: la respuesta a continuación se escribió antes de que apareciera C# 6. En C# 6 puedes escribir:

public class Foo
{
    public string Bar { get; set; } = "bar";
}

También puede escribir propiedades de solo lectura implementadas automáticamente, que solo se pueden escribir en el constructor (pero también se les puede dar un valor inicial predeterminado):

public class Foo
{
    public string Bar { get; }

    public Foo(string bar)
    {
        Bar = bar;
    }
}

Es lamentable que no haya manera de hacer esto ahora. Tienes que establecer el valor en el constructor. (El uso del encadenamiento de constructores puede ayudar a evitar la duplicación).

Las propiedades implementadas automáticamente son útiles en este momento, pero ciertamente podrían ser mejores. No me encuentro deseando este tipo de inicialización con tanta frecuencia como una propiedad implementada automáticamente de solo lectura que solo podría configurarse en el constructor y estaría respaldada por un campo de solo lectura.

Esto no ha sucedido hasta C# 5 inclusive, pero está planificado para C# 6, tanto en términos de permitir la inicialización en el punto de declaración como de permitir que las propiedades implementadas automáticamente de solo lectura se inicialicen en un cuerpo de constructor.

Jon Skeet avatar Oct 04 '2008 06:10 Jon Skeet

Puedes hacerlo a través del constructor de tu clase:

public class foo {
  public foo(){
    Bar = "bar";
  }
  public string Bar {get;set;}
}

Si tienes otro constructor (es decir, uno que toma parámetros) o un grupo de constructores, siempre puedes tener esto (llamado encadenamiento de constructores):

public class foo {
  private foo(){
    Bar = "bar";
    Baz = "baz";
  }
  public foo(int something) : this(){
    //do specialized initialization here
    Baz = string.Format("{0}Baz", something);
  }
  public string Bar {get; set;}
  public string Baz {get; set;}
}

Si siempre encadena una llamada al constructor predeterminado, puede configurar allí todas las inicializaciones de propiedades predeterminadas. Al encadenar, se llamará al constructor encadenado antes que al constructor que llama para que los constructores más especializados puedan establecer diferentes valores predeterminados según corresponda.

Aaron Powell avatar Oct 03 '2008 23:10 Aaron Powell

Esto será posible en C# 6.0:

public int Y { get; } = 2;
romanoza avatar Aug 29 '2014 20:08 romanoza

En el constructor predeterminado (y cualquiera que no sea el predeterminado, si tiene alguno, por supuesto):

public foo() {
    Bar = "bar";
}

Creo que esto no tiene menos rendimiento que su código original, ya que de todos modos esto es lo que sucede detrás de escena.

Matthew Scharley avatar Oct 03 '2008 23:10 Matthew Scharley