`

关于构造函数及参数执行顺序说明(c#)

    博客分类:
  • C#
阅读更多

以前自己对这方面的内容一直比较模糊,只是知道一个大概的顺序,具体确切的执行顺序不能确定,于是抽空做了一个详细的测试,对其进行一番研究.
具体的程序代码比较简单,如下所示.
三个类分开来写的,一个父类,一个子类,一个测试类:

父类:

using System;

namespace TestInherit
{
 public class Father
 {
  public int father_a=111;
  public int father_aa=1111;
  public readonly int father_c=7777;
  public static int father_e=222;
  public static int father_ee;
  static Father()
  {
   father_e=5555;
   father_ee=3333;
  }

  public Father()
  {
   father_ee=4444;
  }
  public Father(int a)
  {
   father_a=a;
  }    
 }
}

 子类:

using System;

namespace TestInherit
{
 public class Son:Father
 {  
  public int son_int=9999;
  public static int son_b=111;
  public static int son_c;
  public Son()
  {
   son_c=222;   
  }
  static Son()
  {
   son_c=333;
  }
  public Son(int a)
  {
   son_int=a;
  }
 }
}

 测试类:

using System;

namespace TestInherit
{
 class Class1
 {
  [STAThread]
  static void Main(string[] args)
  {
    Son son1=new Son ();
  }
 }
}

然后一路F11,进行跟踪,可以得到完整的执行顺序如下所示:
1.子类静态变量;
2.子类静态构造函数;
3.子类非静态变量;
4.父类静态变量;
5.父类静态构造函数;
6.父类非静态变量;
7.父类无参构造函数;
8.子类无参构造函数;

如果Main()方法中改为Son son1=new Son (111),顺序为;
1.子类静态变量;
2.子类静态构造函数;
3.子类非静态变量;
4.父类静态变量;
5.父类静态构造函数;
6.父类非静态变量;
7.父类无参构造函数;
8.子类有参构造函数;


如果子类的有参构造函数改为:
 public Son(int a):base(a)
 {
  son_int=a;
 }
则顺序又有所改变:

1.子类静态变量;
2.子类静态构造函数;
3.子类非静态变量;
4.父类静态变量;
5.父类静态构造函数;
6.父类非静态变量;
7.父类有参构造函数;
8.子类有参构造函数;

以上测试改为父类声明,子类实现,结果也是一样,即mian()方法中改为Father son1=new Son ();

最后作一个总结:
1.一般原理是被依赖的先构造,依赖于人的后构造,c#中是同层依赖(成员变量,其他的类变量等)优先于跨层依赖(父子关系)构造(注意java中正好相反);(子类的变量是不是可以理解为同层的依赖呢??)
2.静态构造函数,静态参数都是优先于非静态构造函数,非静态参数构造或初始化;

分享到:
评论

相关推荐

    c#编写构造函数代码

    根据给定的信息,我们可以深入探讨C#中的构造函数与析构函数的概念,特别是关于它们的调用顺序以及如何实现继承中的构造。 ### C#中的构造函数 #### 构造函数的作用 构造函数是一种特殊的方法,用于初始化新创建的...

    C#中构造函数和析构函数的用法

    构造函数的执行顺序是从基类到派生类,确保所有层次的初始化都能正确进行。 #### 析构函数:清理非托管资源 **1. 原理与作用** 析构函数是一种特殊的成员函数,用于执行对象销毁前的清理工作,尤其是在处理非托管...

    C#中静态构造函数的几点说明介绍

    以下是关于C#静态构造函数的详细说明: 1. 访问性与参数: 静态构造函数没有访问修饰符,如public或private,因为它们由.NET框架自动调用。同样,它们也不接受参数,因为它们不用于创建实例,而是用于初始化类级的...

    C#类继承中构造函数的执行序列示例详解

    可以看到,执行顺序是:System.Object的构造函数、基类的构造函数、派生类的构造函数。 如果我们使用带参数的构造函数实例化MyDerivedClass,例如: MyDerivedClass myObj = new MyDerivedClass(4); 控制台输出...

    C#应用程序开发-构造函数与析构函数.pptx

    在C#应用程序开发中,构造函数和析构函数是两个至关重要的概念,它们在对象生命周期管理中起到关键作用。下面将详细阐述这两个概念及其在C#中的应用。 首先,构造函数(Constructor)的主要职责是初始化类的新实例...

    C#中构造函数和析构函数用法实例详解

    静态构造函数没有参数,不能被显式调用,会在类第一次被使用(如创建实例或访问静态成员)时自动执行。 例如: ```csharp class Employee { private static DataSet ds; static Employee() { ds = new DataSet(....

    C# 静态构造函数使用总结

    7. **执行顺序**:当有类继承关系时,基类的静态构造函数先于派生类的静态构造函数执行。 8. **不可显式调用**:由于静态构造函数由系统自动调用,我们无法在代码中显式地调用它,也无法控制它的执行时机。 9. **...

    构造函数计算器

    4. **构造函数重载**:在同一个类中,可以定义多个构造函数,只要它们的参数列表不同(参数数量、类型或顺序)。这称为构造函数重载,允许根据需要提供不同的初始化方式。 5. **构造函数链**:如果一个类继承自另一...

    C#线程带一个及多个参数实例

    2. 创建一个新的`Thread`对象,将参数化的方法作为参数传递给构造函数: ```csharp object singleParam = "This is a single parameter"; Thread thread = new Thread(new ParameterizedThreadStart(ThreadMethod));...

    C# 对象周期

    3. **实例创建**:使用`new`关键字创建对象时,首先执行类的静态构造函数,然后执行实例构造函数。如果没有显式定义构造函数,编译器会提供一个默认的公共构造函数。如果定义了构造函数,不论是带参数还是无参数,都...

    C#程序设计语言期末考试题A卷及答案.pdf

    5. **构造函数**:创建派生类对象时,先执行基类的构造函数,然后执行派生类的构造函数,这是构造函数的调用顺序。 6. **隐式类型转换**:C#中,如果源类型能够自动转换为目标类型,就允许进行隐式类型转换。 7. *...

    C#程序设计语言期末考试题卷及答案.pdf

    题目中关于先执行派生类构造函数的说法是错误的。 6. **隐式类型转换**: - 隐式类型转换是C#自动进行的类型转换,不需要显式声明目标类型。 7. **基类构造函数**: - 如果基类没有默认构造函数,派生类的构造...

    C#.NET面试题基础篇答案

    静态构造函数的执行顺序是:静态变量 > 静态构造函数 > 实例变量 > 实例构造函数。 四、CTS、CLS、CLR CTS(Common Type System)是通用类型系统,用于定义公共的类型,然后翻译生成对应的.NET类型。CLS(Common ...

    C高级编程学习总结电脑资料.doc

    在这种情况下,必须确保静态构造函数的执行顺序正确,避免出现循环依赖的问题。 在上述例子中,x的值依赖于y的值(x=0+1=1),而y的值依赖于x的值(y=x+1=2)。由于静态构造函数的执行只进行一次,并且在类加载时就...

    C#程序设计语言期末考试题A有答案).doc

    5. **构造函数执行顺序**:创建派生类对象时,先执行基类的构造函数,然后执行派生类的构造函数,这是C#构造器的基本规则。 6. **隐式类型转换**:隐式类型转换允许编译器自动完成类型之间的转换,如从较小的数据...

    C#语言规范5.0中文版(目录版)

    文档详细描述了类和对象的成员,如构造函数、方法、属性、索引器、事件等,以及如何在类中声明和使用这些成员。还包括了可访问性、静态与实例成员、虚方法、抽象方法等面向对象编程中的关键概念。 7. C#的词法结构...

    C#试题-大部分为2013年考题

    `的执行顺序是先`c++`(此时c为9,然后加1变为10),再`5+c`(得到15),最后`d`等于15+10=25,所以输出为25。 8. 对数组的所有元素进行处理时,`foreach`循环是最方便的,它可以遍历数组中的每个元素。 9. 面向...

Global site tag (gtag.js) - Google Analytics