Почему это поле объявлено как частное и доступно только для чтения? - PullRequest
27 голосов
/ 13 июня 2010

В следующем коде:

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

Я попросил что-то пересмотреть мой код , и кто-то предложил этот подход. Мой вопрос: почему переменная IHtmlDownloader доступна только для чтения?

Ответы [ 3 ]

43 голосов
/ 13 июня 2010

Если это личное и readonly, преимущество в том, что вы не можете случайно изменить его из другой части этого класса после его инициализации.Модификатор readonly гарантирует, что поле может быть присвоено значение только во время его инициализации или в конструкторе его класса.

Если что-то функционально не должно измениться после инициализации, всегда полезно использовать доступные языковые конструкции для обеспечения того, чтобы.

5 голосов
/ 13 июня 2010

Это гарантирует, что значение _downloader не будет изменено после выполнения конструктора. Полям, отмеченным как readonly, может быть присвоено значение только из конструктора (ов) класса.

1 голос
/ 08 марта 2018

Поле только для чтения полезно для моделирования данных, которые не должны изменяться после инициализации. Вы можете присвоить значение полю только для чтения, используя инициализатор при его объявлении или в конструкторе, но после этого вы не можете его изменить.

...