2010-06-13 4 views
18

Nel codice seguente:Perché questo campo è dichiarato come privato e anche in sola lettura?

public class MovieRepository : IMovieRepository 
{ 
    private readonly IHtmlDownloader _downloader; 

    public MovieRepository(IHtmlDownloader downloader) 
    { 
     _downloader = downloader; 
    } 

    public Movie FindMovieById(string id) 
    { 
     var idUri = ...build URI...; 

     var html = _downloader.DownloadHtml(idUri); 

     return ...parse ID HTML...; 
    } 

    public Movie FindMovieByTitle(string title) 
    { 
     var titleUri = ...build URI...; 

     var html = _downloader.DownloadHtml(titleUri); 

     return ...parse title HTML...; 
    } 
} 

I asked for something to review my code, e qualcuno ha suggerito questo approccio. La mia domanda è: perché la variabile IHtmlDownloader è in sola lettura?

risposta

29

Se è privato e readonly, il vantaggio è che non è possibile inavvertitamente modificarlo da un'altra parte di tale classe dopo l'inizializzazione. Il modificatore readonly assicura che al campo possa essere assegnato un valore solo durante l'inizializzazione o nel costruttore della classe.

Se qualcosa di funzionale non deve cambiare dopo l'inizializzazione, è sempre buona norma utilizzare costrutti di linguaggio disponibili per applicarlo.

+2

Bingo. Se è di sola lettura, può essere impostato solo tramite l'inizializzazione dell'oggetto o nel costruttore. Non è necessario, ma una parte della qualità del codice sta limitando l'ambito in cui può verificarsi un errore. –

+0

La risposta di Eric è stata buona, ma non aveva senso fino a quando Cylon ha affermato che è possibile modificare solo un campo di sola lettura nell'inizializzazione e nel costruttore. Grazie ragazzi! –

+2

Vi è un ulteriore vantaggio in quanto il compilatore e il JITter possono effettuare determinate ottimizzazioni sapendo che il valore verrà risolto dopo la costruzione. –

4

Ciò garantisce che il valore di _downloader non venga modificato dopo l'esecuzione del costruttore. I campi contrassegnati come readonly possono essere assegnati solo a un valore dal costruttore/i di una classe.

0

Un campo di sola lettura è utile per la modellazione di dati che non devono essere modificati dopo l'inizializzazione. È possibile assegnare un valore a un campo di sola lettura utilizzando un inizializzatore quando lo si dichiara o in un costruttore, ma in seguito non è possibile modificarlo.