Respuestas:
Sí, ambos son de solo lectura, pero hay una diferencia. En el primero, hay un campo de respaldo que se inicializa a 0 antes de que se ejecute el constructor. Puede cambiar el valor solo en el constructor , al igual que un campo de solo lectura normal. El captador en sí solo devuelve el valor del campo.
En el segundo, el getter solo devuelve 0 cada vez, sin ningún campo involucrado.
Entonces, para evitar el uso de propiedades implementadas automáticamente o miembros con cuerpo de expresión, tenemos:
Primera versión
private readonly int _number = 0;
public int Number { get { return _number; } }
Segunda versión
public int Number { get { return 0; } }
Un ejemplo más claro de la diferencia podría verse así:
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;
Si crea un solo objeto, su CreationTime
propiedad siempre dará el mismo resultado, ya que se almacena en un campo de solo lectura, inicializado en la construcción del objeto. Sin embargo, cada vez que acceda a la CurrentTime
propiedad, eso hará DateTime.UtcNow
que se evalúe, por lo que obtendrá un resultado potencialmente diferente.
Una diferencia es cuando eso 0
se evalúa: en la creación del objeto o cuando se usa la propiedad.
Puede ver esto mejor con las propiedades de DateTime:
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
La Start
propiedad sigue regresando la misma hora (de cuando se creó la instancia), mientras que Now
cambia para reflejar la hora actual.
Explicacion :
La primera versión ("Inicio") proporciona un valor inicial que incluso puede ser sobrescrito por el constructor. Entonces esto se evalúa solo una vez.
La segunda versión ("Ahora") proporciona la expresión que será el "captador" de esta propiedad. Entonces esto se evalúa cada vez que se lee la propiedad. Ni siquiera hay un campo de respaldo que el constructor pueda sobrescribir.
Estas son las características del lenguaje C # 6.
Primer ejemplo
public int Number { get; } = 0
El primer ejemplo es una propiedad automática solo para captadores . El campo de respaldo de una propiedad automática solo getter se declara implícitamente como de solo lectura.
Segundo ejemplo
public int Number => 0;
Y el segundo ejemplo son los cuerpos de expresión en miembros de funciones similares a propiedades . Tenga en cuenta que no hay ninguna get
palabra clave: está implícito en el uso de la sintaxis del cuerpo de la expresión.
Ambos son de solo lectura.
random.NextInt()
. La primera versión evaluará eso una vez y siempre tendrá el mismo valor. El segundo devolverá un nuevo valor cada vez.