Pregunta

    

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 la barra 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.
}

Puede ver que agregar un constructor no está en línea con los ahorros de esfuerzo que se supone que obtengo de las propiedades automáticas.

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

public string Bar { get; set; } = "bar";
¿Fue útil?

Solución

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";
}

Puede también escribir propiedades implementadas automáticamente de solo lectura, 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 desafortunado 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 más agradables. No creo que quiera este tipo de inicialización tan a menudo como una propiedad implementada automáticamente de solo lectura 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 se está planificando para C # 6, tanto en términos de permitir la inicialización en el punto de declaración, como permitiendo solo lectura de implementación automática Propiedades que se inicializarán en un cuerpo de constructor.

Otros consejos

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 tener toda la inicialización de propiedades predeterminada establecida allí. Cuando se encadena, se llamará al constructor encadenado antes que al constructor que llama, 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;

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

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

Esto no es menos eficaz que su código original, creo, ya que esto es lo que sucede detrás de escena de todos modos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top