次のコードでは:
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変数が読み取り専用なのかということです。
プライベートでreadonly
の場合、初期化後にそのクラスの別の部分から誤って変更できないという利点があります。 readonly
修飾子は、フィールドが初期化中またはクラスコンストラクターでのみ値を指定できることを保証します。
初期化後に機能的に何かが変更されるべきでない場合は、利用可能な言語構造を使用してそれを強制することを常にお勧めします。
これにより、コンストラクターの実行後に_downloader
の値が変更されないことが保証されます。 readonly
としてマークされたフィールドには、クラスのコンストラクター内からのみ値を割り当てることができます。
読み取り専用フィールドは、初期化後に変更されるべきではないデータのモデリングに役立ちます。宣言時またはコンストラクターで初期化子を使用して読み取り専用フィールドに値を割り当てることはできますが、それ以降は変更できません。