2010-07-27 13 views
16

Queste affermazioni significano la stessa cosa?
C'è una differenza tra readonly e {get; }

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

non è necessario scrivere "int x {get; private set;}"? – jgauffin

+1

@jgauffin: non se il codice è in un'interfaccia. –

+3

Sono abbastanza sicuro che non puoi letteralmente avere 'int x {get; } '(come una proprietà auto), poiché non c'è modo di impostarlo o farlo fare assolutamente nulla. Dovrebbe essere 'int m_x; int x {get {return m_x; }} '. –

risposta

23

In risposta alla tua domanda: C'è è una differenza tra di sola lettura e {get; }:

In int x { get; } (che non verrà compilato in quanto non c'è modo di impostare x - Credo che avevi bisogno public int x { get; private set; }) il codice può continuare a cambiare x

In readonly int x;, x viene inizializzata o in un costruttore o inline e quindi non può mai cambiare.

+4

con readonly x può essere impostato solo nel costruttore o in-line . –

+2

Potrebbe voler chiarire che il suo No a "Queste istruzioni significano lo stesso", ma Sì a "C'è una differenza tra readonly e {get; }'. Forse il titolo o il testo inline dovrebbero essere cambiati per renderlo un po 'meno confuso. – SwDevMan81

+1

'readonly' è importante capire che può essere inizializzato solo in un costruttore. –

11

readonly int x; dichiara un campo di sola lettura su una classe. Questo campo può essere assegnato solo in un costruttore e il suo valore non può essere modificato per tutta la durata della classe.

int x { get; } dichiara una proprietà auto-implementata in sola lettura ed è, in questo formato, non valida (perché non sarebbe assolutamente necessario impostare il valore). Una normale proprietà readonly non garantisce di restituire lo stesso valore ogni volta che viene chiamato. Il valore può cambiare per tutta la durata della lezione. Ad esempio:

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

Questo restituirà un numero diverso ogni volta che viene chiamato. (Sì, questo è un terribile abuso di proprietà).

-1

Letteralmente, non c'è una grande differenza perché hai dichiarato che x è privato (impostazione predefinita). Puoi sempre ricompilare la tua classe per rendere x differente.

Tuttavia, se fosse pubblica, la definizione public int x { get; } consente di espandere successivamente la definizione di qualcosa di simile:

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

È possibile farlo senza rompere i vostri clienti. L'implementazione del getter è privata e i client la chiamano senza sapere se si tratta di un valore statico o di un'operazione all'interno della sua accessor get.

+0

L'OP si riferisce alla differenza tra' readonly' e una proprietà con solo un getter. –

4

No, le affermazioni non significano la stessa cosa. La versione completa della struttura avrà una variabile supporto:

private int _x; 

public int X 
{ 
    get { return _x; } 
} 

Un altro metodo nella classe potrebbe modificare la variabile di supporto, modificando il valore della proprietà:

private void SomeMethod(int someValue) 
{ 
    _x = someValue * 5; 
} 

la readonly parola permette soltanto membro variabile da assegnare nella dichiarazione o nel costruttore:

// 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; 
} 

Quindi una proprietà get -solo cui backup è variabile contrassegnato con readonly è una proprietà di sola lettura.