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 才会得到这个值。
非常感谢
答案 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”