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 的值是“xyz”,而不是“fff”?我本来以为只有cc2。b会得到这个值。

非常感谢

4

6 回答 6

3

“链式”构造函数在构造函数主体之前执行。

因此,首先它在构造函数中分配"fff"三个a参数。
在该构造函数完成执行后,带有一个参数的构造函数的主体将被执行并分配"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

因为具有一个参数的构造函数(您调用)设置 a = "fff" b = "xyz" c = 2 这是由具有 3 个参数的构造函数完成的。之后,单参数构造器设置 a = "xyz"

于 2013-02-22T11:20:57.187 回答