zoukankan      html  css  js  c++  java
  • c# 构造函数执行顺序

    转载自 http://blog.csdn.net/gshgsh1228/article/details/50867274

    所有的类都至少包含一个构造函数。这些构造函数中可能有一个默认的构造函数,默认的构造函数没有参数,与类同名。其它带参数的构造函数称为非默认的构造函数。

    在类的外部不能用私有的构造函数实例化对象,通过把默认的构造函数设置为私有,就可以强制类的用户使用非默认的构造函数。

    一些类没有公共的构造函数,外部代码就不能实例化它。

    静态成员,也称为共享成员,可以在类的实例之间共享。静态成员通过类直接引用。

    一个类只能有一个静态的构造函数,该构造函数不能有访问修饰符,也不能带任何参数。静态构造函数不能直接调用,只能在下述情况下执行:

    (1)创建包含静态构造函数的类的实例时

    (2)访问包含静态构造函数的类的静态成员时

    非静态构造函数也称实例构造函数。

    静态类只包含静态成员,且不能用于实例化对象(如Console)。

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

    创建类的实例时,会调用类的构造函数,为了实例化派生的类,必须实例化它的基类;要实例化这个基类,有必须实例化这个基类的基类,这样一直实例化System.Object(所有类的根),因此无论使用什么构造函数实例化一个类,总是首先调用System.Object.Object().

    下面用例子说明构造函数的执行顺序:

    publicclass MyBaseClass

    {

      Public MyBaseClass()

    {

    }

      Public MyBaseClass(int i)

      {

      }

    }

    publicclass MyDerivedClass:MyBaseClass

    {

      public MyDerivedClass()

      {

      }

      public MyDerivedClass(int i)

      {

      }

      public MyDerivedClass(int i,int j)

      {

      }

    }

     

    使用下面语句实例化MyDerivedClass

    MyDerivedClass myObj=new MyDerivedClass();

    构造函数执行顺序如下:

    (1)执行System.Object.Object()

    (2)执行MyBaseClass.MyBaseClass()

    (3)执行MyDerivedClass.MyDerivedClass()

    另外,使用下面语句实例化MyDerivedClass

    MyDerivedClass myObj=newMyDerivedClass(4,8);

    构造函数执行顺序如下:

    (1)执行System.Object.Object()

    (2)执行MyBaseClass.MyBaseClass()

    (3)执行MyDerivedClass.MyDerivedClass(int i,int j)

    如果我们想要得到下面的执行顺序:

    (1)执行System.Object.Object()

    (2)执行MyBaseClass.MyBaseClass(inti)

    (3)执行MyDerivedClass.MyDerivedClass(int i,int j)

    可以使用base关键字指定.NET实例化过程中使用基类中具有指定参数的构造函数,即:

    publicclass MyDerivedClass:MyBaseClass

    {

      public MyDerivedClass()

      {

      }

      public MyDerivedClass(int i)

      {

      }

      public MyDerivedClass(int i,int j):base(i)

      {

      }

    }

    这样将不会调用MyBaseClass.MyBaseClass()

    除base关键字外,关键字this也可指定构造函数初始化器。这个关键字指定在调用指定的构造函数前,.NET实例化过程对当前类使用非默认的构造函数。

    例如:

    publicclass MyDerivedClass:MyBaseClass

    {

      publicMyDerivedClass():this(5,6)

      {

      }

      public MyDerivedClass(int i)

      {

      }

      publicMyDerivedClass(int i,int j):base(i)

      {

      }

    }

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

    (1)执行System.Object.Object()

    (2)执行MyBaseClass.MyBaseClass(inti)

    (3)执行MyDerivedClass.MyDerivedClass(int i,int j)

    (4)执行MyDerivedClass.MyDerivedClass()

  • 相关阅读:
    后缀数组-另辟蹊径
    Project Euler 不定期更新
    Educational Codeforces Round 93 (Rated for Div. 2)
    Codeforces Round #664 (Div. 2)
    lower_bound和upper_bound的用法
    Codeforces Round #663 (Div. 2)
    Codeforces Round #661 (Div. 3)
    质数笔记
    C++运算符的优先级
    图的构建
  • 原文地址:https://www.cnblogs.com/TJessica/p/6366066.html
Copyright © 2011-2022 走看看