C#构造函数链接:正确用法?

时间:2013-02-22 11:15:56

标签: c# oop design-patterns constructor

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 才会得到这个值。

非常感谢

6 个答案:

答案 0 :(得分:4)

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

首先,它使用三个参数在构造函数中为"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)
    {
    }
}

答案 1 :(得分:0)

this("fff", astring, 2) 

在xyz构造函数之前运行。 所以cc2.a的值为,然后用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;
    }
}

答案 2 :(得分:0)

因为3参数构造函数是在1参数构造函数的主体执行之前执行的。

在伪代码中,它看起来像这样:

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

喜欢这样:

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

答案 3 :(得分:0)

因为在调用其他构造函数之后设置了a = astring ,所以该值会被覆盖。

答案 4 :(得分:0)

您在调用超类构造函数后在构造函数中运行实现,因此您将cc2.a重写为“xyz”。 最后完成的步骤如下:

a = astring;        // = fff
b = anotherstring;  // = xyz
c = anint;          // = 2
a = astring;        // = xyz

答案 5 :(得分:0)

因为带有一个参数(你调用的)的构造函数设置了 a =“fff” b =“xyz” c = 2 这是由具有3个参数的构造函数完成的。之后,one-parameter-contructor设置a =“xyz”