说我有这门课:
class FooBar
{
public FooBar() : this(0x666f6f, 0x626172)
{
}
public FooBar(int foo, int bar)
{
...
}
...
}
如果我这样做:
FooBar foobar = new FooBar();
非参数化的构造函数会先执行,然后是参数化的构造函数,还是相反?
说我有这门课:
class FooBar
{
public FooBar() : this(0x666f6f, 0x626172)
{
}
public FooBar(int foo, int bar)
{
...
}
...
}
如果我这样做:
FooBar foobar = new FooBar();
非参数化的构造函数会先执行,然后是参数化的构造函数,还是相反?
MSDN有一个类似的例子base
:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
并指出:
在此示例中,基类的构造函数在构造函数块执行之前被调用。
不过,为了确保这是我的测试:
class Program
{
public Program() : this(0)
{
Console.WriteLine("first");
}
public Program(int i)
{
Console.WriteLine("second");
}
static void Main(string[] args)
{
Program p = new Program();
}
}
印刷
second
first
所以参数化的构造函数在显式调用的构造函数之前执行。
控件将首先到达默认构造函数。当我们从那里调用参数化构造函数时,默认构造函数中的语句的执行将停止,控件将移至参数化构造函数。一旦参数化构造函数中的语句执行完成,控件将移回默认构造函数。
您可以通过在默认构造函数处放置一个断点来验证它。
不知道这是否被记录为“定义的行为”,但TestClass(int)
先执行然后TestClass()
.
调用构造函数的顺序与构造函数是默认还是非默认(参数化)无关,而是由链接关系确定。
详细来说,每一个跟在关键字后面的构造函数this
都会暂停,程序会跳转到关键字指向的构造函数this
。当到达最后一个链式构造函数时,它的代码就会运行。然后程序运行链中的前一个构造函数,这将一直回到第一个构造函数。
一个例子可以澄清这一点。
假设在一个类中有 3 个构造函数,如下所示:
public class Test
{
// ctor #1
public Test() : this(5) // this jumps to the ctor #2
{
Console.WriteLine("no params");
}
// ctor #2
public Test(int i) : this("Hi") // this jumps to the ctor #3
{
Console.WriteLine("integer=" + i.ToString());
}
// ctor #3
public Test(string str) // this ctor will be run first
{
Console.WriteLine("string=" + str);
}
}
如果使用 调用默认构造函数var t = new Test()
,您将看到以下输出:
// string=Hi -> ctor #3
// integer=5 -> ctor #2
// no params -> ctor #1