C#中构造函数的执行序列(构造函数初始化器 this base)

原文地址:https://www.51baidu.com.cn/
如果在类的构造函数中执行多个任务,把这些代码放在一个地方是非常方便的。 任何构造函数都可以配置为在执行自己的代码前调用其他构造函数。在讨论构造函数前,先看下 在默认情况下,创建类的实例时会发生什么情况。除了把初始化代码集中起来之外,还要了解这些代码。在开发过程中,由于调用构造函数时出现错误,对象常常并没有按照预期的那样执行。发生构造函数调用错误常常是因为类继承结构中的某个基类没有正确实例化,或者没有正确地给基类构造函数提供信息。如果理解在对象生命周期的这个阶段发生的事情,将更利于解决此类问题。

为了实例化派生的类,必须实例化它的基类。而要实例化这个基类,又必须实例化这个基类的基类,这样一直到实例化System.Object(所有类的根)为止。结果是无论使用什么构造函数实例化个类,总是首先调用System.Object.Object().

无论在派生类上使用什么构造函数(默认的构造函数或非默认的构造函数),除非明确指定,否则就使用基类的默认构造的数(稍后将介绍如何改变这个行为)。下面介绍一个简短示例,说明执行的顺序。考虑下面的对象层次结构:

public class MyBaseClass
    {
        public MyBaseClass() { }
        public MyBaseClass(int i) { }
    }
 
    public class MyDerivedClass : MyBaseClass
    {
        public MyDerivedClass() { }
        public MyDerivedClass(int i) { }
        public MyDerivedClass(int i, int j) { }
    }

如果以下面的方式实例化 MyDerivedCass:

MyDerivedClass myobj = new MyDerivedClass();

则执行顺序如下:

1.执行 System.Object.Object() 构造函数

2.执行 MyBaseClass.MyBaseClass() 构造函数

3.执行 MyDerivedClass.MyDerivedClass() 构造函数



如果使用下面的语句:```

MyDerivedClass myobj = new MyDerivedClass(1);

则执行顺序如下:

1.执行 System.Object.Object() 构造函数

2.执行 MyBaseClass.MyBaseClass() 构造函数

3.执行 MyDerivedClass.MyDerivedClass(int i) 构造函数

最后,如果使用下面的语句:```

MyDerivedClass myobj = new MyDerivedClass(1,2);

则执行顺序如下:

1.执行 System.Object.Object() 构造函数

2.执行 MyBaseClass.MyBaseClass() 构造函数

3.执行 MyDerivedClass.MyDerivedClass(int i,int j) 构造函数



        大多数情况下,这个系统都能正常工作。但是,有时需要对发生的事件进行更多的控制。例如,在上面的实例化示例中,可能想得到如下所示的执行顺序:

1.执行 System.Object.Object() 构造函数

2.执行 MyBaseClass.MyBaseClass(int i) 构造函数

3.执行 MyDerivedClass.MyDerivedClass(int i,int j) 构造函数

        

        使用这个顺序,可以把使把 int i参数的代码放在MyBaseClass(int i)中,即MyDerivedClass(int i ,int j) 构造函数要做的工作比较少,只需要处理int j参数(假定 int i 参数在两种两种情况下含义相同)

        为此,只需使用构造的数初始化器,它把代码放在方法定义的冒号后面。例如,可以在派生类的构造函数定义中指定所使用的基类构造函数,如下所示:```

public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass() { }
public MyDerivedClass(int i) { }
public MyDerivedClass(int i, int j):base(i) { }
}

其中,base关键字指定.NET实例化过程使用基类中具有指定参数的构造函数,这里使用了一个int参数(其值通过参数i 传送给MyDerivedClass构造函数),所以将使用MyBaseClass(int i)。这么做将不会调用MyBaseClass()。
除了[base](https://www.51baidu.com.cn/Home/Detail/2513)关键词外,还可将另一个关键字 [this](https://www.51baidu.com.cn/Home/Detail/2513) 用作构造函数初始化器。这个关键字指定在调用指定的构造函数钱,.NET 实例化过程对当前类使用非默认的构造函数。例如:
  

public class MyDerivedClass : MyBaseClass
{
    public MyDerivedClass():this(5,6) { }
    public MyDerivedClass(int i) { }
    public MyDerivedClass(int i, int j):base(i) { }
}

使用 MyDerivedClass.MyDerivedClass() 构造函数,将执行下述序列:

1.执行 System.Object.Object() 构造函数

2.执行 MyBaseClass.MyBaseClass(int i) 构造函数

3.执行 MyDerivedClass.MyDerivedClass(int i,int j) 构造函数

4.执行 MyDerivedClass.MyDerivedClass() 构造函数

注:如果没有给构造函数指定构造函数初始化器,编译器就会自动添加base()。  



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值