调用构造函数的顺序c#中的继承情况

时间:2012-02-07 05:54:54

标签: c# .net c#-4.0

我只是在C#中读取继承,其中我遇到了构造函数,并且写了构造函数按派生顺序执行。这是什么意思?将首先调用该基类构造函数或者派生班。

4 个答案:

答案 0 :(得分:16)

首先调用基类构造函数。参见以下示例

// 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.

答案 1 :(得分:3)

类构造函数按派生所暗示的顺序调用,但重要的是要注意在C#中,字段初始值设定项(例如int foo=5)在基类构造函数之前运行,因此以相反的顺序运行。如果基础构造函数可能导致在基础构造函数完成之前调用派生类中被覆盖的虚函数,则这非常有用。这样的函数将看到由字段初始值设定项初始化的任何变量已经初始化。

顺便说一句,VB.net在基类构造函数完成之后,但在派生类构造函数中的任何内容之前运行所有字段初始值设定项(除了基本构造函数的链之外)。这意味着虚方法必须知道字段初始化器可能没有运行,但也意味着字段初始化器可以使用构造下的对象(它们在C#中无法做到)。

顺便说一句,在VB.net中,尽管很笨重,但是可以通过新创建的IDisposable实例安全地初始化字段(并确保在构造过程的任何部分抛出异常时它们将被处置)。在C#中,必须避免使用字段初始化器来创建在构造抛出异常时无法安全放弃的任何东西,因为无法访问部分构造的对象来清理它。

答案 2 :(得分:2)

首先调用基类构造函数。您可以自己轻松地测试它:

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();
        }
    }
}

答案 3 :(得分:0)

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的对象时,构造函数首先转到派生(),然后由于其调用而转到 Parent()构造函数调用从底部到顶部完成但后来你发现它首先执行Parent()然后是Derived,这是因为它的执行。 从上到下执行构造函数。这就是为什么它首先打印Parent然后Base而基本构造函数首先打印。