说我有这个班:
class FooBar
{
public FooBar() : this(0x666f6f, 0x626172)
{
}
public FooBar(int foo, int bar)
{
...
}
...
}
如果我这样做了:
FooBar foobar = new FooBar();
非参数化构造函数会先执行,然后执行参数化构造函数,还是反过来呢?
答案 0 :(得分:4)
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
所以参数化构造函数在显式调用之前执行。
答案 1 :(得分:3)
控件将首先到达默认构造函数。当我们从那里调用参数化构造函数时,默认构造函数中的语句的执行将停止,控件将移动到参数化构造函数。一旦参数化构造函数中的语句执行完成,控件将返回默认构造函数。
您可以通过在默认构造函数中放置一个断点来验证它。
答案 2 :(得分:1)
不知道是否将其记录为“已定义的行为”,但TestClass(int)
先执行,然后TestClass()
执行。
答案 3 :(得分:1)
调用构造函数的顺序与 default 或 non-default(parametrized)的构造函数无关,而是由链接关系决定。< / p>
详细地说,每个跟在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