C#构造函数执行顺序

在C#中,当你这样做

Class(Type param1, Type param2):base(param1) 

是先执行的类的构造函数,然后调用超类的构造函数,或者先调用基构造函数?

顺序是:

  • 成员variables被初始化为层次结构中所有类的默认值

然后从最派生的类开始:

  • variables初始化器是为了派生最多的types而执行的
  • 构造函数链接将调用哪个基类构造函数
  • 基类初始化(recursion所有:)
  • 在这个类的链中的构造函数体被执行(注意,如果它们与Foo() : this(...)链接,可以有多个Foo() : this(...)

请注意,在Java中,基类是variables初始化器运行之前初始化的。 如果你曾经移植过任何代码,这是一个重要的区别:)

如果您有兴趣,我可以提供更多详细信息 。

它将首先调用基础构造函数。 另外请记住,如果您不在构造函数后面添加:base(param1) ,则会调用基类的空构造函数。

首先调用基类的构造函数。

不知道这应该是一个评论/回答,但对于那些通过示例学习这个小提琴说明顺序以及: https : //dotnetfiddle.net/kETPKP

 using System; // order is approximately /* 1) most derived initializers first. 2) most base constructors first (or top-level in constructor-stack first.) */ public class Program { public static void Main() { var d = new D(); } } public class A { public readonly C ac = new C("A"); public A() { Console.WriteLine("A"); } public A(string x) : this() { Console.WriteLine("A got " + x); } } public class B : A { public readonly C bc = new C("B"); public B(): base() { Console.WriteLine("B"); } public B(string x): base(x) { Console.WriteLine("B got " + x); } } public class D : B { public readonly C dc = new C("D"); public D(): this("ha") { Console.WriteLine("D"); } public D(string x) : base(x) { Console.WriteLine("D got " + x); } } public class C { public C(string caller) { Console.WriteLine(caller + "'s C."); } } 

结果:

 D's C. B's C. A's C. A A got ha B got ha D got ha D 

[编辑:在我回答的时候,问题已经完全改变了]。

答案是,它首先调用基础。

[以下老问题的原始答案]

你在问什么时候做构造函数调用的“基础”位?

如果是这样的话,如果这个类是从具有这个构造函数的另一个类派生出来的话,那么你可以“调用”构造函数的基类:

  public class CollisionBase { public CollisionBase(Body body, GameObject entity) { } } public class TerrainCollision : CollisionBase { public TerrainCollision(Body body, GameObject entity) : base(body, entity) { } } 

在这个例子中, TerrainCollision派生自CollisionBase 。 通过以这种方式链接构造函数,它确保指定的构造函数在提供的参数的基类上调用,而不是默认的构造函数(如果基底上有一个构造函数)

你的问题有点不清楚,但我假设你打算提出以下问题

何时我调用我的XNA对象的基础构造函数与使用impilict默认构造函数

这个答案高度依赖于你的场景和底层对象。 你能澄清一下以下几点

  • 什么情况
  • TerrainCollision基础对象的types是什么?

我最好的答案是,如果你的参数与基类的构造函数的参数一致,你几乎肯定会调用它。

构造函数的机制要好得多,因为它使应用程序使用构造函数链,如果要扩展应用程序,则通过inheritance来启用最小代码更改的function。 Jon Skeets文章