构造函数的执行顺序
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可以改变类内默认的调用顺序 |
- 博客是我学习和思考的输出,愿你有所收获。
- 有想法请留言,共同探讨学习。
- 由于博主能力有限,文中可能存在描述不当,恳请指正!
- 你也可以关注我的公众号:ProgramLife042,名称:风之程序人生,方便接收最新内容。


浙公网安备 33010602011771号