propiedades - static readonly c#
¿Hay alguna diferencia entre readonly y{get;} (4)
En respuesta a su pregunta: hay una diferencia entre readonly y {get; }:
En int x { get; }
int x { get; }
(que no se compilará, ya que no hay forma de configurar x; creo que necesitabas public int x { get; private set; }
) tu código puede seguir cambiando x
En readonly int x;
, x se inicializa ya sea en un constructor o en línea y luego nunca se puede cambiar.
¿Estas declaraciones significan lo mismo?
int x { get; }
readonly int x;
Literalmente, no hay una gran diferencia porque has declarado que x
es privado (el valor predeterminado). Siempre puedes volver a compilar tu clase para hacer x diferente.
Sin embargo, si fuera pública, la definición public int x { get; }
public int x { get; }
te permite expandir más tarde la definición a algo como esto:
int x { get {
return DoSomeOperation();
}
}
Puedes hacerlo sin romper a tus clientes. La implementación del captador es privada y los clientes la llaman sin saber si es un valor estático o si tiene una operación dentro de su get
acceso.
No, las declaraciones no significan lo mismo. La versión completa de la propiedad tendrá una variable de respaldo:
private int _x;
public int X
{
get { return _x; }
}
Otro método en la clase podría modificar la variable de respaldo, cambiando el valor de la propiedad:
private void SomeMethod(int someValue)
{
_x = someValue * 5;
}
La palabra clave readonly
solo permite asignar una variable miembro en su declaración o en el constructor:
// Both of these compile
private readonly int _x = 1;
public SomeClass()
{
_x = 5;
}
// This will not compile
private void SomeMethod(int someValue)
{
_x = someValue * 5;
}
Por lo tanto, una propiedad get
-only cuya variable de respaldo está marcada como readonly
es una verdadera propiedad de solo lectura.
readonly int x;
declara un campo de solo lectura en una clase. Este campo solo puede asignarse en un constructor y su valor no puede cambiar durante la vida útil de la clase.
int x { get; }
int x { get; }
declara una propiedad auto-implementada de solo lectura y es, en esta forma, inválida (porque no tendría ninguna forma de establecer el valor). Una propiedad de solo lectura normal no garantiza devolver el mismo valor cada vez que se llama. El valor puede cambiar a lo largo de la vida útil de la clase. Por ejemplo:
public int RandomNumber
{
get { return new Random().Next(100); }
}
Esto devolverá un número diferente cada vez que lo llames. (Sí, este es un terrible abuso de propiedades).