2010-07-29 13 views
24

Eventuali duplicati:
What are the benefits to marking a field as readonly in C#?Perché utilizzare in sola lettura in C#

Ho sempre usato la parola chiave in sola lettura in C# in situazioni in cui so che avrete solo bisogno di impostare il riferimento di un oggetto una volta (es. una connessione di servizio WCF su una pagina ASP.NET). Oltre a garantire semplicemente che gli oggetti non possano essere impostati più di una volta, quali sono i vantaggi dell'utilizzo di readonly su un riferimento standard come statico privato o privato? Sembra vago. Ci sono implicazioni sulla performance?

risposta

26

Le differenze di prestazioni a parte, direi che il grande vantaggio è che si forniscono informazioni utili su cosa è la variabile e per cosa viene utilizzata (modifica: questo è ancora più utile quando qualcun altro si occupa della manutenzione del tuo codice ...)

Inoltre, come hai detto, impedisce a qualcuno di sovrascrivere quello che intendevi essere un valore costante. Penso che da sola sia una giustificazione sufficiente per il suo utilizzo ...

28

readonly esiste esclusivamente per impedire a chiunque, accidentalmente o intenzionalmente, di modificare il valore di una variabile una volta impostata. Viene applicato in fase di esecuzione.

const è simile, ma applicato in fase di compilazione. Pertanto, il valore deve essere impostato al momento della creazione della variabile.

Uno di questi può essere combinato con altri modificatori, ad esempio public, private o static.

+0

che ho letto diverse descrizioni di 'readonly' e il tuo sembra differire. Sei sicuro che sia giusto? Sono un ragazzo Java, ma da quello che ho letto, 'readonly' impedisce solo la riassegnazione del riferimento al di fuori del costruttore o della dichiarazione. Quello che stai scrivendo suona molto simile a 'final' di Java. – Vlasec

8

Un campo readonly può essere impostato solo in fase di inizializzazione o in un costruttore. Ciò offre un notevole vantaggio per la manutenzione in corso poiché si può essere sicuri che sia stato impostato quando l'oggetto è stato creato e non è stato cambiato in un oggetto diverso da allora. Non ci sono benefici per le prestazioni.

In generale, non si deve contrassegnare un campo di un tipo mutabile come letto solo perché l'oggetto stesso può essere successivamente modificato. FxCop definisce una regola di avviso per questo - http://msdn.microsoft.com/en-us/library/ms182302(v=vs.120).aspx

+4

L'oggetto PU CAN essere modificato se si tratta di un tipo di riferimento mutabile. Gli articoli possono essere aggiunti a una lista dichiarata di sola lettura. –

+2

Non si dovrebbero dichiarare tipi di riferimento modificabili di sola lettura per questo motivo: http://msdn.microsoft.com/en-us/library/ms182302%28VS.80%29.aspx. Ma buon punto per tirarti su. –

+4

@DavidNeale: Sapere che un campo di tipo di riferimento punta sempre allo stesso oggetto è spesso un'informazione molto utile, anche se varie proprietà dell'oggetto potrebbero cambiare.Tra l'altro, ad un dato livello di astrazione, è molto più semplice mantenere la sicurezza del thread quando c'è un solo livello di mutabilità rispetto a quando ci sono due o più (questo è un grande motivo "Elenco " non è thread-safe , anche per gli scenari di sola aggiunta in cui 'T' è un tipo di riferimento) - contiene un riferimento mutabile a un array mutabile. – supercat

2

La chiarezza di scopo e utilizzo sembra essere la ragione migliore per utilizzare readonly. Sebbene tu possa sostenere che puoi lasciare la scrittura semplicemente perché non è ancora sicura e non è necessario.

2

Basta ricordare che, mentre l'arbitro non può essere modificato per sola lettura, se l'oggetto è mutevole lo stato dell'oggetto può ancora essere modificato (cioè elementi aggiunti a un elenco)

Problemi correlati