首先调用哪个 - 基础构造函数或"其他东西"?
public class MyExceptionClass : Exception { public MyExceptionClass(string message, string extrainfo) : base(message) { //other stuff here } }
Sam Meldrum.. 143
基类构造函数在派生类构造函数之前调用,但派生类初始化程序在基类初始化程序之前调用.例如,在以下代码中:
public class BaseClass { private string sentenceOne = null; // A public BaseClass() { sentenceOne = "The quick brown fox"; // B } } public class SubClass : BaseClass { private string sentenceTwo = null; // C public SubClass() { sentenceTwo = "jumps over the lazy dog"; // D } }
执行顺序为:C,A,B,D.
看看这两篇msdn文章:
为什么初始化程序的运行顺序与构造函数相反?第一部分
为什么初始化程序的运行顺序与构造函数相反?第二部分
craigb.. 108
首先调用基础构造函数.
试试吧:
public class MyBase { public MyBase() { Console.WriteLine("MyBase"); } } public class MyDerived : MyBase { public MyDerived():base() { Console.WriteLine("MyDerived"); } }
你是对的。但是执行从派生构造函数开始,派生构造函数所做的第一件事是调用基本构造函数(如果有)。因此,似乎首先调用了基本构造函数。 (3认同)
David Poklud.. 36
不要试图记住它,试着向自己解释一下会发生什么.想象一下,你有一个名为Animal的基类和一个名为Dog的派生类.派生类为基类添加了一些功能.因此,当执行派生类的构造函数时,基类实例必须可用(以便您可以向其添加新功能).这就是为什么构造函数从基础执行到派生但是析构函数以相反的方式执行 - 首先是派生的析构函数,然后是基础析构函数.
(这是简化的,但它可以帮助你在将来回答这个问题,而不需要实际记住它.)
基类构造函数在派生类构造函数之前调用,但派生类初始化程序在基类初始化程序之前调用.例如,在以下代码中:
public class BaseClass { private string sentenceOne = null; // A public BaseClass() { sentenceOne = "The quick brown fox"; // B } } public class SubClass : BaseClass { private string sentenceTwo = null; // C public SubClass() { sentenceTwo = "jumps over the lazy dog"; // D } }
执行顺序为:C,A,B,D.
看看这两篇msdn文章:
为什么初始化程序的运行顺序与构造函数相反?第一部分
为什么初始化程序的运行顺序与构造函数相反?第二部分
首先调用基础构造函数.
试试吧:
public class MyBase { public MyBase() { Console.WriteLine("MyBase"); } } public class MyDerived : MyBase { public MyDerived():base() { Console.WriteLine("MyDerived"); } }
不要试图记住它,试着向自己解释一下会发生什么.想象一下,你有一个名为Animal的基类和一个名为Dog的派生类.派生类为基类添加了一些功能.因此,当执行派生类的构造函数时,基类实例必须可用(以便您可以向其添加新功能).这就是为什么构造函数从基础执行到派生但是析构函数以相反的方式执行 - 首先是派生的析构函数,然后是基础析构函数.
(这是简化的,但它可以帮助你在将来回答这个问题,而不需要实际记住它.)
实际上,首先执行派生类构造函数,但C#编译器将对基类构造函数的调用作为派生构造函数的第一个语句插入.
所以:派生首先执行,但它"看起来"首先执行了基础.
正如其他人所说的那样,首先调用基础构造函数.然而,构造函数并不是真正发生的第一件事.
假设您有这样的课程:
class A {} class B : A {} class C : B {}
首先,将按照从大多数派生到最少派生的类的顺序调用字段初始值设定项.所以第一场初始值C
,然后B
,然后A
.
然后,构造函数将被调用以相反的顺序:首先A
的构造函数,然后B
,然后C
.