2

说我有这门课:

class FooBar
{
    public FooBar() : this(0x666f6f, 0x626172)
    {
    }

    public FooBar(int foo, int bar)
    {
        ...
    }
 ...
}

如果我这样做:

FooBar foobar = new FooBar();

非参数化的构造函数会先执行,然后是参数化的构造函数,还是相反?

4

4 回答 4

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

所以参数化的构造函数在显式调用的构造函数之前执行。

于 2012-06-02T20:40:30.993 回答
3

控件将首先到达默认构造函数。当我们从那里调用参数化构造函数时,默认构造函数中的语句的执行将停止,控件将移至参数化构造函数。一旦参数化构造函数中的语句执行完成,控件将移回默认构造函数。

您可以通过在默认构造函数处放置一个断点来验证它。

于 2012-06-02T20:37:17.470 回答
1

不知道这是否被记录为“定义的行为”,但TestClass(int)先执行然后TestClass().

于 2012-06-02T20:38:55.173 回答
1

调用构造函数的顺序与构造函数是默认还是非默认(参数化)无关,而是由链接关系确定。

详细来说,每一个跟在关键字后面的构造函数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
于 2018-02-09T16:34:22.390 回答