私は2つのコンストラクタを持つクラスを持っています:
public class Lens
{
public Lens(string parameter1)
{
//blabla
}
public Lens(string parameter1, string parameter2)
{
// want to call constructor with 1 param here..
}
}
2番目のコンストラクターから最初のコンストラクターを呼び出します。これはC#で可能ですか?
実行するコンストラクターの最後に:this(required params)
を追加します 'constructor chaining'
public Test( bool a, int b, string c )
: this( a, b )
{
this.m_C = c;
}
public Test( bool a, int b, float d )
: this( a, b )
{
this.m_D = d;
}
private Test( bool a, int b )
{
this.m_A = a;
this.m_B = b;
}
csharp411.com のソース提供
はい、次を使用します
public class Lens
{
public Lens(string parameter1)
{
//blabla
}
public Lens(string parameter1, string parameter2) : this(parameter1)
{
}
}
コンストラクターを連鎖するときは、コンストラクター評価の順序も考慮する必要があります。
Gishuの答えを借りるには、少し(コードを多少似たように保つために):
_public Test(bool a, int b, string c)
: this(a, b)
{
this.C = c;
}
private Test(bool a, int b)
{
this.A = a;
this.B = b;
}
_
private
コンストラクターで実行される評価を少し変更すると、コンストラクターの順序が重要である理由がわかります。
_private Test(bool a, int b)
{
// ... remember that this is called by the public constructor
// with `this(...`
if (hasValue(this.C))
{
// ...
}
this.A = a;
this.B = b;
}
_
上記に、プロパティC
に値があるかどうかを決定する偽の関数呼び出しを追加しました。一見、C
には値があるように見えるかもしれません。これは呼び出しコンストラクターで設定されています。ただし、コンストラクターは関数であることを覚えておくことが重要です。
public
コンストラクターの本体が実行される前に、this(a, b)
が呼び出され、「戻る」必要があります。言い換えると、最後に呼び出されたコンストラクターが最初に評価されたコンストラクターです。この場合、private
はpublic
の前に評価されます(可視性を識別子として使用するためだけです)。