2010-07-27 21 views
16

¿Estas afirmaciones significan lo mismo?
¿Hay alguna diferencia entre readonly y {get; }

int x { get; } 
readonly int x; 
+0

¿no tienes que escribir "int x {get; private set;}"? – jgauffin

+1

@jgauffin: No si el código está en una interfaz. –

+3

Estoy bastante seguro de que no puedes literalmente tener 'int x {get; } '(como una propiedad de auto), ya que no hay forma de establecerlo o hacer que haga nada en absoluto. Tendría que ser 'int m_x; int x {get {return m_x; }} '. –

Respuesta

23

En respuesta a su pregunta: ¿Hay es una diferencia entre sólo lectura y {get; }:

En int x { get; } (que no se compilará ya que no hay manera de establecer x - Creo que necesitaba public int x { get; private set; }) su código puede seguir cambiando x

En readonly int x;, x es inicializado ya sea en un constructor o en línea y luego nunca puede cambiar

+4

con sólo lectura sólo se puede establecer en el constructor o en línea . –

+2

posible que desee aclarar que su No a 'hacer estas declaraciones significan lo mismo', pero sí a '¿Hay una diferencia entre sólo lectura y {get; } '. Tal vez el título o el texto en línea se debe cambiar para que sea un poco menos confuso. – SwDevMan81

+1

'readonly' es importante entender que sólo se puede inicializar en un constructor. –

11

readonly int x; declara un campo de solo lectura en una clase. Este campo solo se puede asignar en un constructor y su valor no puede cambiar durante el tiempo de vida de la clase.

int x { get; } declara una propiedad de sólo lectura automática implementado y es, de esta forma, no es válido (porque no tendría ninguna manera en absoluto para 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 de la clase. Por ejemplo:

public int RandomNumber 
{ 
    get { return new Random().Next(100); } 
} 

Esto devolverá un número diferente cada vez que lo llame. (Sí, este es un terrible abuso de propiedades).

-1

Literalmente, no hay gran diferencia porque ha declarado que x es privado (valor predeterminado). Siempre puedes volver a compilar tu clase para hacer que x sea diferente.

Sin embargo, si fuera pública, la definición public int x { get; } le permite ampliar más adelante la definición de algo como esto:

int x { get { 
    return DoSomeOperation(); 
    } 
} 

Puede hacerlo sin romper sus clientes. La implementación del getter es privada y los clientes lo llaman sin saber si es un valor estático o si tiene una operación dentro de su accessor get.

+0

La OP es sobre la diferencia entre' readonly' y una propiedad con sólo una getter. –

4

No, las declaraciones no significan lo mismo. La versión completa de la propiedad tendrá una variable 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 sólo permite una variable miembro que se asignará 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; 
} 

Así que un get propiedad -sólo cuyo respaldo es variable de marcado readonly es una verdadera propiedad de solo lectura.

Cuestiones relacionadas