构造函数的执行顺序


构造函数的作用及使用方法

任何构造函数都可以进行配置,以便在执行自己的代码前调用其它构造函数。

我们首先看看在创建类的实例时会发生什么情况。为了实例化派生的类,必须实例化它的基类。而要实例化这个基类,又必须实例化这个基类的基类,这样一直实例化到System.Object为止。结果是无论使用什么构造函数实例化一个类,总是要先调用System.Object.Object()

如果对一个类使用非默认的构造函数,默认的情况是在其基类上使用匹配于这个构造函数签名的构造函数。如果没有找到这样的构造函数,就使用基类的默认构造函数(根类System.Object总是要使用默认的构造函数,因为这个类没有非默认的构造函数)。

我们以下面这个小代码段例子作一些说明:

  

   public  class MyBaseClass
    {
       publicMyBaseClass()
       {
       }

        publicMyBaseClass(int i)
       {
       }
    }

    public class MyDerivedClass : MyBaseClass
    {
       publicMyDerivedClass()
       {
       }

       publicMyDerivedClass(int i)
       {
       }

       publicMyDerivedClass(int i,intj)
       {
       }
    }

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

   MyDerivedClass myObj = newMyDerivedClass();

则发生下面的一系列事件:
    1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass()构造函数。
    3.执行MyDerivedClass.MyDerivedClass()构造函数。

如果使用下面的语句:

MyDerivedClassmyObj = newMyDerivedClass(4);

则发生下面的—系列事件:
        1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass(int i)构造函数。
    3.执行MyDerivedClass.MyDerivedClass(inti)构造函数。

如果使用下面的语句:

MyDerivedClassmyObj = newMyDerivedClass(4,8);

则发生下面的—系列事件:
    1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass()构造函数。
    3.执行MyDerivedClass.MyDerivedClass(inti, int j)构造函数。

有时需要对发生的事件进行更多的控制。例如,在上面的实例化范例中,需要有下面的事件序列:
    1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass(int i)构造函数。
    3.执行MyDerivedClass.MyDerivedClass(inti, int j)构造函数。

使用这个序列可以在编写MyBaseClass(int i)中使用inti参数的代码,即MyDerivedClass(int i, int j)构造函数要做的工作比较少,只需要处理int j参数(假定int i参数在两种情况下有相同的含义)。我们仅需指定在派生类的构造函数定义中所使用的基类的构造函数,如下所示:

   public class MyDerivedClass :MyBaseClass
   {
      ……
      publicMyDerivedClass(int i,intj) :base(i)
      {
      }
   }

其中,base关键字指定.NET实例化过程,以使用基类中匹配指定签名的构造函数。这个例子中使用一个int参数,所以在实例化序列中应调用MyBaseClass(int i)。

同时我们也可以使用这个关键字指定基类构造函数的字面值。

    public class MyDerivedClass :MyBaseClass
    {
       publicMyDerivedClass() : base(5)
       {
       }
       ……
    }

这段代码将执行以下序列:
    1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass(inti)构造函数。
    3.执行MyDerivedClass.MyDerivedClass()构造函数。

下面我们介绍另一个关键字this。这个关键字指定在调用指定的构造函数前,.NET实例化过程对当前类使用非默认的构造函数。

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

这段代码将执行以下序列:
    1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass(int i)构造函数。
    3.执行MyDerivedClass.MyDerivedClass(inti,int j)构造函数。
    4.执行MyDerivedClass.MyDerivedClass()构造函数。

唯一的限制是使用thisbase关键字只能指定一个构造函数。但是如上所示,这并不是一个很严厉的限制,按照上述方式仍可以构造相当复杂的执行序列。

 




1.为什么使用静态构造函数?

     类有一些静态字段和属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性

 

2.静态构造函数什么时候执行?

    CLR不能确定静态构造函数什么时候执行,也不能预计不同类的静态构造函数按什么顺序执行,但可以明确的是,静态构造函数之多执行一次,即在引用类之前执行

    在C#中,静态构造函数通常在第一次调用类的成员之前执行

 

3.静态构造函数有访问修饰符吗?

    没有。因为,C#代码从不调用它,但在加载类时,总是由,CLR调用它。对于C#来说是私有的吧

 

4.静态构造函数可以有参数吗?

    不能有参数。

 

5.一个类可以有多个静态构造函数吗?

    一个类只能有一个静态构造函数

 

6.静态构造函数可以访问实例成员吗?

    显然不能。只能访问静态成员



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值