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才能得到这个值。
非常感谢
"链式"构造函数在构造函数主体之前执行。
因此,首先在构造函数中用三个参数将"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"