web-dev-qa-db-ja.com

同じクラスの別のコンストラクターからコンストラクターを呼び出す

私は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#で可能ですか?

134
Robbert Dam

実行するコンストラクターの最後に: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 のソース提供

213
Gishu

はい、次を使用します

public class Lens
{
    public Lens(string parameter1)
    {
       //blabla
    }

    public Lens(string parameter1, string parameter2) : this(parameter1)
    {

    }
}
31
Matthew Dresser

コンストラクターを連鎖するときは、コンストラクター評価の順序も考慮する必要があります。

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)が呼び出され、「戻る」必要があります。言い換えると、最後に呼び出されたコンストラクターが最初に評価されたコンストラクターです。この場合、privatepublicの前に評価されます(可視性を識別子として使用するためだけです)。

13
Thomas