构造函数链接优先级

时间:2012-06-02 20:28:22

标签: c# constructor constructor-chaining

说我有这个班:

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

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

如果我这样做了:

FooBar foobar = new FooBar();

非参数化构造函数会先执行,然后执行参数化构造函数,还是反过来呢?

4 个答案:

答案 0 :(得分:4)

MSDNbase有类似的例子:

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