web-dev-qa-db-ja.com

C#コンストラクターで初期化する場合、イニシャライザリストまたは代入のどちらが良いですか。

クラスAは初期化リストを使用してメンバーをパラメーター値に設定し、クラスBはコンストラクターの本体内の割り当てを使用します。

私が一貫している限り、誰かが他のものよりもどちらかを好む理由を与えることはできますか?

class A
{
    String _filename;

    A(String filename) : _filename(filename)
    {
    }
}


class B
{
    String _filename;

    B(String filename)
    {
        _filename = filename;
    }
}
29
mindless.panda

最初のものはC#では合法ではありません。コンストラクターでコロンの後に表示できるのは、basethisの2つだけです。

だから私は2番目のものを使います。

78
JaredPar

C#ではなくC++ですか?

C++の場合、いくつかの理由により、初期化リストは代入よりも優れています。

  • PODタイプ(int、floatなど)の場合、データの初期化子を提供すると、オプティマイザは多くの場合、舞台裏でより効率的なmemcpyを実行できます。
  • 非PODタイプ(オブジェクト)の場合、1つの構築のみを行うことで効率が上がります。コンストラクターでの割り当てでは、コンパイラーはまずオブジェクトを作成し、次に別のステップでオブジェクトを割り当てる必要があります(これはPODタイプにも適用されます)。
17
Jeremy Bell

C#には Object Initializer と呼ばれる機能があります。指定したメンバーを初期化するためにコンパイラーが使用する値を提供し、デフォルトのコンストラクターを呼び出すことができます。これを機能させるには、デフォルトのパブリックコンストラクターが必要です。

1