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

本文关键字:构造函数 链接 | 更新日期: 2023-09-27 18:00:47

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

非常感谢

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

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

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

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

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;
    }
}

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

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

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

不是这样:

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

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

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

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