次のコードでは:
public class A
{
public A():this(null){}
public A(string b){/*code here*/}
}
最初のコンストラクターの使用は何ですか?
次のコードでは:
public class A
{
public A():this(null){}
public A(string b){/*code here*/}
}
最初のコンストラクターの使用は何ですか?
null
最初のコンストラクターは、2 番目のコンストラクターのパラメーター b に渡しています。
したがって、呼び出すnew A()
と、呼び出すのと同じになりますnew A(null)
パラメータを持つコンストラクタがある場合
public A(string b){ /* code here */ }
public A():this("") { } //default
デフォルトのコンストラクターは、実際には "" をパラメーターとして "パラメーター コンストラクター" を呼び出します。パラメータを渡しています。これは、同じコードを 2 回記述することを避けるために行われます。
コンストラクターのオーバーロードです。
とにかく、文字列の初期化されていない値がnullである可能性が最も高いため、この場合はあまり役に立たないように思われることに同意します。
C# のコンストラクターも参照してください。
これは、コンストラクターをオーバーロードしているときに発生します。
あなたの例では、空public A():this(null){}
のコンストラクターは、null のオブジェクト値を受け取ることができるコンストラクターを探します。文字列は null を取ることができるオブジェクトであるため、そのコンストラクターを呼び出します。
この例は非常に単純に見えます。
より意味のある例 (ただし、基本的なままにしておきます):
public class AddNumbers
{
public AddNumbers():this(100, 100)
{ }
public AddNumbers(int x, int y)
{
int sum = x + y;
Console.WriteLine(sum.ToString());
}
}
この例では、呼び出しプログラムが空のコンストラクターを呼び出すと、200 が出力されます。これは、x = 100、y = 100 で AddNumbers メソッドを呼び出しているためです。
簡単な例だと思いますが、それがより明確になることを願っています。
これは、b==null で second を呼び出すデフォルトのコンストラクターです。
一部のインターフェイスまたはデザイナーでは、「パラメーターのない」コンストラクターが必要です。
そんな時にこの方法は重宝します。
オブジェクトの初期化を使用する場合は、パラメーターなしの既定のコンストラクターが必要です。
Employee e = new Employee() {FirstName="John", LastName="Smith"};
ただし、この場合、おそらくコンストラクター チェーンは使用しません。コンストラクターのオーバーロードは、パラメーターで初期化する別の方法を提供します。コンストラクター チェーンが本当に役立つのは、コンストラクター パラメーターをオプションにする場合です。C# はオプションのパラメーターを (まだ) サポートしていません。
「ベスト プラクティス」は、状況、使用法、アーキテクチャ、要件などによって異なります (ISO コンサルティング ルール 1:「場合による」)。