¿Por qué se declara este campo como privado y también readonly?


En el siguiente código:

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...;
    }
}

Pedí algo para revisar mi código, y alguien sugirió este enfoque. Mi pregunta es ¿por qué la variable IHtmlDownloader es readonly?

Author: Community, 2010-06-13

3 answers

Si es privado y readonly, el beneficio es que no puede cambiarlo inadvertidamente de otra parte de esa clase después de que se inicialice. El modificador readonly asegura que el campo solo puede recibir un valor durante su inicialización o en su constructor de clase.

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

 37
Author: Eric J.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-02 19:39:32

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

 5
Author: M4N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-13 19:21:28

Un campo de solo lectura es útil para modelar datos que no deben cambiar después de haber sido inicializados. Puede asignar un valor a un campo de solo lectura utilizando un inicializador cuando lo declara o en un constructor, pero a partir de entonces no puede cambiarlo.

 1
Author: sree lakshmi kurra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-08 12:31:06