参考
この記事は、以下の動画を参考にしています。詳しくは、動画をご覧ください。
プライマリーコンストラクター
コンストラクターに渡したオブジェクトを、他のメンバーで利用する場合、
- オブジェクトを格納するフィールドを用意
- コンストラクターで、フィールドにコンストラクター引数を代入
- 他のメンバーで、フィールドを参照する
というコードが必要になる。
// .NET 7
public class MyService
{
private readonly IDependent _dependent; // フィールド
public MyService(IDependent dependent)
{
_dependent = dependent; // フィールドにコンストラクター引数を代入
}
public void Do()
{
_dependent.DoWork();
}
}
プライマリーコンストラクターを使えば、
- コンストラクター引数(実態はフィールド)を、他のメンバーから参照できる
ようになる。
// .NET 8
public class MyService(IDependent dependent) // プライマリーコンストラクター
{
public void Do()
{
dependent.DoWork();
}
}
注意点
プライマリーコンストラクターのコンストラクター引数は、他のメンバーから代入が可能である。
// .NET 8
public class MyService(IDependent dependent)
{
public void Do()
{
dependent = null; // コンストラクター引数へ代入できる
dependent.DoWork();
}
}
書き換えられないことを保証するために、フィールドにはreadonly
を付けることができるが、プライマリーコンストラクターではreadonly
を付けることができない。
安全なコードを記述するには、 従来の記述を使う必要がある。readonly
なフィールドを定義し、初期値をコンストラクター引数にするとよい。(下記、@juner さんのコメントを参照してください)