microsoft - property en c#
Inicializando auto-propiedades de C# (4)
Esta pregunta ya tiene una respuesta aquí:
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 ...
}
La conversión de Bar a una propiedad automática parece conveniente y concisa, pero ¿cómo puedo conservar la inicialización sin agregar un constructor y poner 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 los ahorros de esfuerzo que se supone que obtengo de las propiedades automotrices.
Algo como esto tendría más sentido para mí:
public string Bar { get; set; } = "bar";
Actualización: la respuesta a continuación fue escrita antes de que llegara 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 le puede asignar un valor inicial predeterminado:
public class Foo
{
public string Bar { get; }
public Foo(string bar)
{
Bar = bar;
}
}
Es desafortunado que no hay forma de hacer esto ahora. Tienes que establecer el valor en el constructor. (Usar el encadenamiento de constructor puede ayudar a evitar la duplicación).
Las propiedades implementadas automáticamente son útiles en este momento, pero sin duda podrían ser más agradables. No me resulta deseable este tipo de inicialización tan a menudo como una propiedad de solo lectura implementada automáticamente que solo podría establecerse en el constructor y estaría respaldada por un campo de solo lectura.
Esto no ha sucedido hasta e incluyendo C # 5, pero está siendo 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 de solo lectura implementadas automáticamente sean inicializadas en un cuerpo constructor.
En el constructor predeterminado (y en los que no sean los predeterminados, si tiene alguno también, por supuesto):
public foo() {
Bar = "bar";
}
Esto no es menos efectivo que el código original, creo, ya que esto es lo que sucede detrás de las escenas de todos modos.
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 paramters) o un grupo de constructores siempre puedes tener esto (llamado constructor chaining):
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 tener toda la inicialización de propiedad predeterminada establecida allí. Al encadenar, se llamará al constructor encadenado antes del constructor de la llamada para que sus constructores más especializados puedan establecer diferentes valores predeterminados según corresponda.
Será posible en C # 6.0:
public int Y { get; } = 2;