2010-06-13 9 views
18

Im folgenden Code:Warum wird dieses Feld als privat und auch schreibgeschützt deklariert?

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, und jemand schlug vor, diesen Ansatz. Meine Frage ist, warum ist die IHTLDownloader Variable readonly?

Antwort

29

Wenn es privat ist und readonly, ist der Vorteil, dass Sie es nicht unbeabsichtigt von einem anderen Teil dieser Klasse ändern können, nachdem es initialisiert ist. Der Modifizierer readonly stellt sicher, dass das Feld nur während seiner Initialisierung oder in seinem Klassenkonstruktor einen Wert erhalten kann.

Wenn sich etwas funktionell nach der Initialisierung nicht ändern sollte, ist es immer gut, verfügbare Sprachkonstrukte zu verwenden, um dies zu erzwingen.

+2

Bingo. Wenn es nur gelesen wird, kann es nur entweder durch Objektinitialisierung oder im Konstruktor festgelegt werden. Es ist nicht notwendig, aber ein Teil der Codequalität beschränkt den Bereich, in dem ein Fehler auftreten kann. –

+0

Erics Antwort war gut, machte aber keinen Sinn, bis Cylon sagte, dass man nur ein schreibgeschütztes Feld in der Initialisierung und im Konstruktor ändern konnte. Danke Leute! –

+2

Es gibt einen zusätzlichen Vorteil darin, dass der Compiler und der JITter bestimmte Optimierungen bewirken können in dem Wissen, dass der Wert nach der Konstruktion behoben wird. –

4

Dies stellt sicher, dass der Wert _downloader nicht geändert wird, nachdem der Konstruktor ausgeführt wurde. Felder, die als readonly gekennzeichnet sind, können nur innerhalb des Konstruktors einer Klasse einen Wert zugewiesen bekommen.

0

Ein schreibgeschütztes Feld ist nützlich für die Modellierung von Daten, die sich nach der Initialisierung nicht ändern sollten. Sie können einem schreibgeschützten Feld einen Wert zuweisen, indem Sie bei der Deklaration oder in einem Konstruktor einen Initialisierer verwenden. Danach können Sie ihn jedoch nicht mehr ändern.