2010-08-03 5 views
21

Sto lavorando a un progetto utilizzando ReSharper. A volte mi suggerisce che un campo può essere reso in sola lettura. C'è qualche prestazione o altro beneficio a questo? Presumo che i benefici sarebbero piuttosto di basso livello, o qualsiasi beneficio sarebbe puramente semantico?C'è qualche vantaggio nel rendere un campo C# di sola lettura se appropriato?

Grazie

Con esempio sotto il campo era inizialmente solo privato, ma ReSharper chiesto di impostarlo come sola lettura. Capisco il motivo per cui può essere impostato come readonly, cioè. il suo essere impostato nel costruttore e non è cambiato di nuovo, ma chiedo solo se ci sono dei vantaggi di questo ...

public class MarketsController : Controller 
{ 
    private readonly IMarketsRepository marketsRepository; 

    public AnalysisController(IMarketsRepository marketsRepository) 
    {     
     this.marketsRepository = marketsRepository; 
    } 
} 

Modifica Qual è il modo più semplice per guardare il MSIL?

+0

si prega di spiegare con il codice. potrebbe essere facile rispondere a – anishMarokey

risposta

23

Il vantaggio è puramente semantico. Aiuterà gli utenti del tuo codice a comprendere esplicitamente che questo campo non può essere modificato dopo la creazione dell'oggetto. Il compilatore preverrà modifiche indesiderate di questo campo. Sono completamente d'accordo con la seguente citazione da Python Zen:

L'esplicito è meglio che implicito.

Alcuni dettagli:

L'unica differenza tra il campo normale e campo di sola lettura è la bandiera initonly in IL. Non c'è ottimizzazione su di esso (come con le costanti) perché in realtà consente tutte le operazioni (get e set, ma solo in ctor). È solo un suggerimento per il compilatore: non lasciare che sia cambiato dopo la costruzione.

.field public initonly int32 R 
+5

+1: essere esplicito riguardo ai campi di sola lettura aiuta in maniera massiccia quando si ragiona su sistemi con multithreading. Quando aggiungi un campo istanza a qualsiasi classe, dovresti pensare a quale dovrebbe essere modificato o meno. In caso contrario, contrassegnalo come readonly - semplice come quello. In effetti, a volte penso che ci dovrebbe essere una parola chiave 'mutabile' piuttosto che 'readonly' (annuisci su F # e sulle sue lingue madri). –

2

Potresti essere interessato a this answer.

La parola sola lettura viene utilizzato per dichiarare una variabile membro una costante, ma permette il valore da calcolare in fase di esecuzione. Si differenzia da una costante dichiarata con il modificatore const , che deve avere il suo valore impostato in fase di compilazione. Con l'utilizzo di read2ly è possibile impostare il valore del campo nella dichiarazione o nel costruttore dell'oggetto a cui appartiene il campo .

8

Non sono tanto le prestazioni di basso livello, quanto la manutenibilità di alto livello. Fare le cose di sola lettura è una delle possibilità che devi limitare e controllare il numero di luoghi in cui un certo valore può essere cambiato. Ciò a sua volta significa che si riduce l'interdipendenza tra le classi (a.k.a "accoppiamento libero"); il risultato è un'applicazione che ha meno dipendenze interne e quindi una complessità inferiore. In altre parole, i campi e le proprietà di sola lettura rendono la tua applicazione più manutenibile.

2

Potrebbe anche aiutare a individuare alcuni bug. Il valore è assegnato solo in un construcotor e questo potrebbe essere un problema se ti sei dimenticato di cambiare altrove o no. E se non si suppone che debba essere modificato, lo si contrassegna come una sola lettura.

3

Il mio professore mi ha insegnato in passato che dichiarare qualcosa in modo diretto è un modo di ammettere sul proprio computer che si sbagliano.

+0

Il debug sta ammettendo che hai commesso un errore. –

+1

"Mai provato, mai fallito, non importa, riprova, fallisci di nuovo, fallisci meglio" - è così che impariamo e nulla di cui vergognarsi. In quel particolare contesto 'readonly' vorrei andare con Alex Humphrey: non è un errore, è un anticipo. – mbx