C#构造函数链接:正确使用?
对于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
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”