调用基数和派生构造函数的顺序

时间:2010-08-31 06:58:21

标签: c#

我有一个基类和派生类。如果我正在创建派生类的对象,将首先采用哪个构造函数:基础构造函数或派生构造函数?

9 个答案:

答案 0 :(得分:4)

实例构造函数以相反的顺序初始化。首先初始化基础构造函数,然后是派生的构造函数。

看看http://www.csharp411.com/c-object-initialization/

可以很好地概述对象的字段和构造函数的初始化顺序:

  1. 派生的静态字段
  2. 派生的静态构造函数
  3. 派生的实例字段
  4. 基础静态字段
  5. 基础静态构造函数
  6. 基本实例字段
  7. 基本实例构造函数
  8. 派生实例构造函数

答案 1 :(得分:3)

首先调用基础构造函数。这很容易验证:

class Program 
{
    class Base
    {
        public Base()
        {
            Console.WriteLine("base ctor");
        }
    }

    class Derived : Base
    {
        public Derived()
        {
            Console.WriteLine("derived ctor");
        }
    }

    static void Main()
    {
        new Derived();
    }
}

答案 2 :(得分:2)

首先调用base class构造函数

 class Base
            {
                public Base()
                {
                    Console.WriteLine("Base");
                }

            }
            class Derived : Base
            {
                public Derived()
                {
                    Console.WriteLine("Derived");
                }
            }

 class Program
        {
            static void Main()
            {
                Derived d = new Derived();
            }

        }

输出

Base 

Derived

答案 3 :(得分:2)

在面值处(即没有代码)处理问题,然后,基类构造函数首先运行。这样可以首先初始化基类 - 派生类可能依赖于初始化的基类中的对象。

如果有两个或更多级别的继承,则首先调用最不专业的构造函数。

答案 4 :(得分:1)

首先,基础c'tor将运行,然后派生一个。

答案 5 :(得分:1)

首先调用基础构造函数。

试一试:

public class MyBase 
{ 
  public MyBase() 
  { 
    Console.WriteLine("MyBase"); 
  } 
} 

public class MyDerived : MyBase 
{ 
  public MyDerived():base() 
  { 
    Console.WriteLine("MyDerived"); 
  } 
} 

请查看此链接了解详情 - http://www.csharp-station.com/Tutorials/lesson08.aspx

答案 6 :(得分:0)

首先处理基类构造函数,然后是每个派生的构造函数。

*编辑添加了以下代码* 您可以通过创建一个ClassOne对象并使用以下的调试“Step Into”来看到这一点:

class BaseClass
{
  public BaseClass(int num)
  {
    this.fieldNumber = num;
  }
  private int fieldNumber;
}

class ClassOne : BaseClass
{
  public ClassOne(int num1, int num2): base(num1)
  {
    this.fieldNumber = num2;
  }
  private int fieldNumber;
}

答案 7 :(得分:0)

假设你的代码是这样的:

class Foo
{
  public Foo()
  {}
}

class Bar : Foo
{
  public Bar() : base()
  {}
}

然后调用Bar的构造函数将首先运行Foo的构造函数。

答案 8 :(得分:0)

首先调用基类构造函数。

例如,如果您有这些类:

public class A {
  public A() {
    Console.WriteLine("a");
  }
}

public class B : A {
  public B() {
    Console.WriteLine("b");
  }
}

如果您创建类B的实例,它将首先输出“a”,然后输出“b”。