2010-06-13 17 views
18

En el siguiente código:¿Por qué este campo se declara como privado y también de solo lectura?

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, y alguien sugirió este enfoque. Mi pregunta es ¿por qué la variable IHtmlDownloader es solo de lectura?

Respuesta

29

Si es privado y readonly, la ventaja es que no se puede cambiar inadvertidamente de otra parte de esa clase después de que se haya inicializado. El modificador readonly garantiza que al campo solo se le puede dar un valor durante su inicialización o en su constructor de clase.

Si algo funcionalmente no debería cambiar después de la inicialización, siempre es una buena práctica usar las construcciones de lenguaje disponibles para hacer cumplir eso.

+2

Bingo. Si es de solo lectura, solo se puede establecer mediante la inicialización del objeto o en el constructor. No es necesario, pero parte de la calidad del código está limitando el alcance en el que puede ocurrir un error. –

+0

La respuesta de Eric fue buena, pero no tuvo sentido hasta que Cylon dijo que solo se podía cambiar un campo de solo lectura en la inicialización y el constructor. ¡Gracias chicos! –

+2

Existe un beneficio adicional en el hecho de que el compilador y el JITter pueden efectuar ciertas optimizaciones sabiendo que el valor será reparado después de la construcción. –

4

Esto asegura que el valor de _downloader no se cambiará después de que se ejecutó el constructor. A los campos marcados como readonly solo se les puede asignar un valor dentro del constructor (es) de una clase.

0

Un campo de solo lectura es útil para modelar datos que no deberían cambiar después de haberse inicializado. Puede asignar un valor a un campo de solo lectura usando un inicializador cuando lo declara o en un constructor, pero a partir de entonces no puede cambiarlo.

Cuestiones relacionadas