2

C# を初めて使用し、コンストラクター チェーンを検討しています。

私は次のクラスを持っています:

class ConstructorChaining
{
    public string a;
    public string b;
    public int c;

    public ConstructorChaining(string astring, string anotherstring, int anint)
    {
        a = astring;
        b = anotherstring;
        c = anint;
    }

    public ConstructorChaining(string astring) : this("fff", astring, 2)
    {
        a = astring;
    }
}

このようにインスタンス化し、フィールドの値を出力すると:

ConstructorChaining cc2 = new ConstructorChaining("xyz");
Console.WriteLine(cc2.a);
Console.WriteLine(cc2.b);
Console.WriteLine(cc2.c);

cc2.a の値が「fff」ではなく「xyz」なのはなぜですか? 私はcc2だけだと思っていたでしょう。bはこの値を取得します。

どうもありがとう

4

6 に答える 6

3

「連鎖」コンストラクターは、コンストラクターの本体の前に実行されます。

"fff"したがって、最初に3つのパラメーターを使用しaてコンストラクターでに割り当てます。
そのコンストラクターの実行が終了すると、1つのパラメーターを持つコンストラクターの本体が実行され、に割り当て"xyz"られaます。

以下は、連鎖コンストラクターの賢明な実装です。

class ConstructorChaining
{
    public string a;
    public string b;
    public int c;

    public ConstructorChaining(string astring, string anotherstring, int anint)
    {
        a = astring;
        b = anotherstring;
        c = anint;
    }

    public ConstructorChaining(string astring) : this(astring, astring, 2)
    {
    }
}
于 2013-02-22T11:17:39.687 に答える
0
this("fff", astring, 2) 

xyzコンストラクターの前に実行されます。したがって、cc2.aにはvalye fffがあり、xyzで上書きします

class ConstructorChaining
{
    public string a;
    public string b;
    public int c;

    public ConstructorChaining(string astring, string anotherstring, int anint)
    {
        a = astring;
        b = anotherstring;
        c = anint;
    }

    public ConstructorChaining(string astring) : this("fff", astring, 2)
    {
        //This code will be executed After your 3 param constructor. 
        a = astring;
    }
}
于 2013-02-22T11:18:11.913 に答える
0

3パラメーターコンストラクターは、1パラメーターコンストラクターの本体が実行される前に実行されるためです。

擬似コードでは、次のようになります。

public ConstructorChaining(string astring) 
{
    this("fff", astring, 2)
    a = astring;
}

このようではありません

public ConstructorChaining(string astring) 
{
    a = astring;
    this("fff", astring, 2)
}
于 2013-02-22T11:18:31.267 に答える
0

a = astring 他のコンストラクターを呼び出した後に設定したため、値が上書きされます。

于 2013-02-22T11:18:39.077 に答える
0

スーパークラスコンストラクターの呼び出し後にコンストラクターで実装を実行するため、cc2.a をオーバーライドして「xyz」にします。最後に、実行される手順は次のとおりです。

a = astring;        // = fff
b = anotherstring;  // = xyz
c = anint;          // = 2
a = astring;        // = xyz
于 2013-02-22T11:18:52.680 に答える
0

(呼び出す) 1 つのパラメーターを持つコンストラクターが a = "fff" b = "xyz" c = 2 を設定するため、これは 3 つのパラメーターを持つコンストラクターによって行われます。その後、one-parameter-contructor が a = "xyz" を設定します。

于 2013-02-22T11:20:57.187 に答える