web-dev-qa-db-ja.com

このフィールドがプライベートおよび読み取り専用として宣言されているのはなぜですか?

次のコードでは:

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変数が読み取り専用なのかということです。

31
Sergio Tapia

プライベートでreadonlyの場合、初期化後にそのクラスの別の部分から誤って変更できないという利点があります。 readonly修飾子は、フィールドが初期化中またはクラスコンストラクターでのみ値を指定できることを保証します。

初期化後に機能的に何かが変更されるべきでない場合は、利用可能な言語構造を使用してそれを強制することを常にお勧めします。

44
Eric J.

これにより、コンストラクターの実行後に_downloaderの値が変更されないことが保証されます。 readonlyとしてマークされたフィールドには、クラスのコンストラクター内からのみ値を割り当てることができます。

5
M4N

読み取り専用フィールドは、初期化後に変更されるべきではないデータのモデリングに役立ちます。宣言時またはコンストラクターで初期化子を使用して読み取り専用フィールドに値を割り当てることはできますが、それ以降は変更できません。

1