unity setters propiedades property getters example and c# getter shorthand code-conventions coding-style

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.