在C#中,当您执行
Class(Type param1, Type param2) : base(param1)
类的构造函数首先被执行,然后调用超类的构造函数,还是先调用基类的构造函数?
在C#中,当您执行
Class(Type param1, Type param2) : base(param1)
类的构造函数首先被执行,然后调用超类的构造函数,还是先调用基类的构造函数?
顺序如下:
然后从最派生的类开始:
Foo() : this(...)
等进行链接,则可能有多个构造函数)请注意,在 Java 中,基类在运行变量初始化器之前初始化。如果您要移植任何代码,则需要了解这个重要的区别 :)。
如果您感兴趣,可以查看更多详细信息的页面。
首先会调用基础构造函数。此外请注意,如果您在构造函数后没有加上: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
首先调用基类的构造函数。
[编辑:在我回答的时间内,问题已经完全改变了]
答案是它首先调用基类。
[下面是旧问题的原始答案]
你是否在问何时执行构造函数调用中的“base”部分?
如果是这样,如果该类派生自另一个具有此构造函数的类,则会“链接”到构造函数基类:
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对象中何时调用基本构造函数vs.使用隐式默认构造函数
这个答案高度取决于您的场景和底层对象。您能否通过以下方式澄清一下:
TerrainCollision
的基本对象类型是什么?我最好的答案是,如果您有与基类构造函数的参数相对应的参数,则几乎肯定应该调用它。