setters - Diferencia en C#entre diferentes estilos getter
set c# (3)
Estas son las características del lenguaje C # 6.
Primer ejemplo
public int Number { get; } = 0
El primer ejemplo es una propiedad automática de getter . 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 palabra clave
get
: está implícito en el uso de la sintaxis del cuerpo de la expresión.
Ambos son de solo lectura.
A veces veo abreviaturas en las propiedades del captador. Por ejemplo, esos dos tipos:
public int Number { get; } = 0
public int Number => 0;
¿Puede alguien decirme si hay alguna diferencia entre esos dos? ¿Cómo se comportan? ¿Ambos son de solo lectura?
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 propiedad
CreationTime
siempre dará el mismo resultado, porque se almacena en un campo de solo lectura, inicializado en la construcción del objeto.
Sin embargo, cada vez que acceda a la propiedad
CurrentTime
, eso hará que se evalúe
DateTime.UtcNow
, por lo que obtendrá un resultado potencialmente diferente.
Una diferencia es cuando se evalúa ese
0
: 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 propiedad
Start
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 el constructor puede incluso sobrescribir.
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.