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文章