2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プライマリーコンストラクターの注意点

Last updated at Posted at 2024-02-28

参考

この記事は、以下の動画を参考にしています。詳しくは、動画をご覧ください。

プライマリーコンストラクター

コンストラクターに渡したオブジェクトを、他のメンバーで利用する場合、

  • オブジェクトを格納するフィールドを用意
  • コンストラクターで、フィールドにコンストラクター引数を代入
  • 他のメンバーで、フィールドを参照する

というコードが必要になる。

// .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 さんのコメントを参照してください)

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?