C# 类的初始化顺序
继承类的static数据成员的初始化器,
继承类的static构造器 (在类名, 第一次被引用时, 调用, 如果, 没有这个构
造器, 则static数据成员何时被初始化, 是不可预测的)
继承类的实例型数据成员的初始化器
在执行继承类的构造器的内容之前;
基类的static数据成员 的初始化器 即 static int a = 1;
/// 类数据成员的定义
基类的static 构造器 ,(如果,基类的类名, 先于继承类被引用, 则先执行基
类的static构造器)
基类的实例型数据成员的初始化器
基类的构造器
接着执行继承类的构造器的内容;
Example :
public class Base
{
A: private static int Number = 12;
B: private int localNumner = 1;
C: static Base()
{
///
}
D: public Base()
{
}
}
public class Child : Base
{
E: private static int ChildNumber = 14;
F: private int local_child_number = 7;
G: static Child()
{
///
}
H: public Child()
{
I: ///
}
}
Child child = new Child();
初始化顺序为
E G F H A C B D I;
static构造器的调用时刻是, 第一次引用该类的类名;
public class Test
{
static Test()
{
}
public staitc int Account
{
get
{
return 1;
}
}
/// 只是举例
public static int GetAccount()
{
return 1;
}
public class Nested
{
}
public delegate void Add();
}
当 X1: Test.Account();
X2: Test a = new Test();
X3: Test.GetAccount();
X4: Test.Nested p = new Test.Nested();
X5: Test.Add a = new Add(someMethods);
{ X1, X2, X3, X4, X5 }, 只要第一次出现其中的某一个; 就调用Test的
static构造器
第一:进入static void Main()
第二:运行static void Main() 中的Application.Run(new Form1());在这中间对窗体进行构造。
执行private System.ComponentModel.Container components = null;作用是Container 类是IContainer 接口的默认实现。容器是封装和跟踪零个或更多个组件的对象。在此上下文中,包容是指逻辑包荣, 而不是直观包容。可以在多种方案下使用组件和容器,包括可视化方案和非可视化方案。
在一个先入先出列表中跟踪容器中的组件,该列表也定义了容器内组件的顺序。
所添加的组件会附加到列表的结尾。
执行窗体构造函数public Form1()初始化窗体
执行构造函数中的InitializeComponent(); 在这个函数中对WINDOWS控件(System.Windows.Forms.Control)和窗体初始化
执行ResumeLayout(false);ResumeLayout:当调整控件的多个属性时,将先后使用 SuspendLayout 和ResumeLayout 方法取消多个Layout 事件。例如,通常先调用 SuspendLayout 方法,然后设置控件的 Size、Location、Anchor 或 Dock 属性,最后调用 ResumeLayout(bool) 方法以使更改生效。默认是TRUE恢复正常的布局逻辑,FALSE改变布局。
第三:执行后显示窗体,进行程序的运行,等待事件发生,并响应事件。
第四:关闭窗体. exit Application.Run(可能相当于WINDOWS中的消息循环机制)函数, 程序结束.
C#程序是从Main函数开始执行的,也就是说Main()是程序的入口点。
构造器-〉应该是构造函数吧,它是在实例化类的时候执行。静态字段或方法则不需要实例化类即可以使用。
哪有那么麻烦,顺序就是 先main入口,然后静态块,静态方法,静态变量初始化,构造在实例化(NEW)的时候再执行,完毕