调用构造函数的顺序在c#中继承的情况下
本文关键字:继承 情况下 构造函数 顺序 调用 | 更新日期: 2023-09-27 18:22:43
我刚刚读了C#中的继承,在其中我遇到了构造函数,并被写为构造函数是按派生顺序执行的这是什么意思?该基类构造函数将被称为first或Derived类。
首先调用基类构造函数。参考以下示例
// Demonstrate when constructors are called.
using System;
// Create a base class.
class A {
public A() {
Console.WriteLine("Constructing A.");
}
}
// Create a class derived from A.
class B : A {
public B() {
Console.WriteLine("Constructing B.");
}
}
// Create a class derived from B.
class C : B {
public C() {
Console.WriteLine("Constructing C.");
}
}
class OrderOfConstruction {
static void Main() {
C c = new C();
}
}
The output from this program is shown here:
Constructing A.
Constructing B.
Constructing C.
基类构造函数将首先被调用。你可以很容易地自己测试:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DerivationTest
{
class Program
{
public class Thing
{
public Thing()
{
Console.WriteLine("Thing");
}
}
public class ThingChild : Thing
{
public ThingChild()
{
Console.WriteLine("ThingChild");
}
}
static void Main(string[] args)
{
var tc = new ThingChild();
Console.ReadLine();
}
}
}
类构造函数是按照派生隐含的顺序调用的,但需要注意的是,在C#中,字段初始化器(例如int foo=5
)在基类构造函数之前运行,因此以相反的顺序运行。如果基构造函数可能导致在基构造函数完成之前调用派生类中重写的虚拟函数,那么这一点非常有用。这样的函数将看到由字段初始化器初始化的任何变量都已初始化。
顺便说一句,VB.net在基类构造函数完成之后,但在派生类构造函数(到基类构造函数的链除外)中的任何东西之前,运行所有字段初始化程序。这意味着虚拟方法必须意识到字段初始化器可能没有运行,但也意味着字段初始化器可以使用构造中的对象(在C#中无法做到这一点)。
顺便说一句,在VB.net中,类可以使用新创建的IDisposable实例安全地初始化字段(并确保在构建过程的任何部分引发异常时,这些字段都会被处理),尽管这很笨拙。在C#中,如果构造抛出异常,则必须避免使用字段初始值设定项来创建任何无法安全放弃的内容,因为将无法访问部分构造的对象来清理它。
using System;
class Parent
{
public Parent () {
Console.WriteLine("Hey Its Parent.");
}
}
class Derived : Parent
{
public Derived () {
Console.WriteLine("Hey Its Derived.");
}
}
class OrderOfExecution {
static void Main() {
Derived obj = new Derived();
}
}
此程序的输出如下所示:
嘿,它的父母。
嘿,它是派生的。
构造函数在继承中的行为不同,这让新程序员感到困惑。构造函数的执行有两个概念1.呼叫2.执行当您创建派生类Named derived的对象时,构造函数首先转到derived(),然后由于其调用而转到Parent()构造函数调用是从下到上完成的,但您会发现它先执行Parent(),然后派生,这是因为它的Execution。从上到下执行的构造函数。这就是为什么它先打印Parent,然后打印Base,而基类构造函数先调用。