博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造函数的执行顺序
阅读量:5314 次
发布时间:2019-06-14

本文共 2575 字,大约阅读时间需要 8 分钟。

 
1:  using System;
2:  using System.Collections.Generic;
3:  using System.Linq;
4:  using System.Text;
5:   
6:  namespace 实例构造器 {
7:      /*   class A {
8:             private static int a = 1;
9:
10:             static A() {
11:                 a = 3;
12:             }
13:
14:             public string b = "bjq";
15:
16:             public A() {
17:                 a = 2;
18:             }
19:
20:             static void Main(string[] args) {
21:                 Console.WriteLine(a);
22:                 Console.ReadLine();
23:             }
24:         */
25:   
26:      class Program {
27:          public static int num1;
28:          public static int num2 = 1;
29:          public static int num3;
30:          static void Main(string[] args) {
31:              Console.WriteLine(num2);
32:              Console.WriteLine(B.num5); //这里引用了类B的静态成员
33:              Console.ReadLine();
34:          }
35:          static Program() {
36:              Console.WriteLine(num1);
37:              num3 = 5; ;
38:              Console.WriteLine(num3);
39:          }
40:      }
41:   
42:      class A {
43:          public static int num4 = 1;
44:          static A() //注意这里是静态的构造函数
45:         {
46:              num4 = 9;
47:          }
48:      }
49:   
50:      class B {
51:          public static int num5 = A.num4 + 1; //类B中引用了类A的静态成员
52:          B() { } //注意这里改为了静态的构造函数
53:      }
54:  }

还有一段代码,也是说明这个使用的:

关键是静态字段以及改变顺序的this和base,注意有参数和没有参数时候的构造函数调用,基本没有问题啦

using System;
class Base {
static Base() {
Console.WriteLine("基类静态构造函数被调用。");
}
 
private static Component baseStaticField = new Component("基类静态字段被实例化。");
private Component baseInstanceField = new Component("基类实例成员字段被实例化。");
 
public Base() {
Console.WriteLine("基类构造函数被调用。");
}
}
 
//此类型用作派生类,同基类一样,它也包含静态构造函数,以及静态字段、实例成员字段各一个。
class Derived : Base {
static Derived() {
Console.WriteLine("派生类静态构造函数被调用。");
}
 
private static Component derivedStaticField = new Component("派生类静态字段被实例化。");
private Component derivedInstanceField = new Component("派生类实例成员字段被实例化。");
 
public Derived() {
Console.WriteLine("派生类构造函数被调用。");
}
}
 
//此类型用于作为Base类和Derived类的成员
//此类型在实例化的时候可以在控制台输出自定义信息,以给出相关提示
class Component {
public Component(String info) {
Console.WriteLine(info);
}
}
 
//在主程序里实例化了一个子类对象
class Program {
static void Main(string[] args) {
Derived derivedObject = new Derived();
Console.Read();
}
}

总的原则,也就是根据内存的布局,CLR加载方法的过程确定的,基本知道对象的创建过程就是没有问题了~

大体的顺序:

静态字段
静态构造函数(值类型不一定执行~)
实例字段
实例构造函数(递归到System.Object逐个基类执行)使用base和this可以改变类内默认的调用顺序

转载于:https://www.cnblogs.com/lijinfeng042/archive/2011/10/27/2226871.html

你可能感兴趣的文章
ELMAH——可插拔错误日志工具
查看>>
MySQL学习笔记(四)
查看>>
【Crash Course Psychology】2. Research & Experimentation笔记
查看>>
两数和
查看>>
移动设备和SharePoint 2013 - 第3部分:推送通知
查看>>
SOPC Builder中SystemID
查看>>
MySQL数据库备份工具mysqldump的使用(转)
查看>>
NTP服务器配置
查看>>
【转】OO无双的blocking/non-blocking执行时刻
查看>>
ul li剧中对齐
查看>>
关于 linux 的 limit 的设置
查看>>
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
查看>>
vim中文帮助教程
查看>>
MySQL基础3
查看>>
云计算数据与信息安全防护
查看>>
全局设置导航栏
查看>>
RxJS & Angular
查看>>
面向对象(多异常的声明与处理)
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>