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

C#构造函数链接:正确使用?,c#,oop,design-patterns,constructor,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 = anotherstrin

对于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会得到这个值

非常感谢

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

因此,首先,它使用三个参数将
“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)
    {
    }
}
在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;
    }
}

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

在伪代码中,它如下所示:

public ConstructorChaining(string astring) 
{
    this("fff", astring, 2)
    a = astring;
}
public ConstructorChaining(string astring) 
{
    a = astring;
    this("fff", astring, 2)
}
不是这样的:

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

因为您在调用另一个构造函数后设置了
a=astring
,所以该值会被覆盖。

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

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

因为只有一个参数(您调用的)的构造函数 a=“fff” b=“xyz” c=2 这是由构造函数使用3个参数完成的。然后,单参数构造函数设置a=“xyz”