类的初始化顺序
原理:静态成员是和实例成员的存储和管理方式不一样。
静态成员:被static修饰的成员,叫做静态成员。静态成员是属于类的。通过类名直接访问。
- 当类第一次被访问的时候,就会将这个类下面的所有的静态成员创建在内存当中。
- 静态成员既不在栈也不在堆中。创建在静态存储区。
- 静态成员只创建一次,在类第一次被访问的时候创建。
- 静态成员一旦被创建在静态存储区,那么就不会被回收,直到程序结束。
实例成员:没有被static修饰的成员叫做实例成员。实例成员是属于对象的。通过对象名去访问实例成员。
- 在创建对象的时候,实例成员跟随着对象一起创建在堆中。
- 跟着对象一起创建在堆空间中。
- 有多少个对象,实例成员就有多少份。
- 对象被回收,这个对象中的实例成员就跟随着一起回收。
创建类的一个实例时,在执行构造函数之前,如果你没有给成员变量赋初始值,C#编译器缺省将每一个成员变量初始化为他的默认值。
类的初始化顺序 如下:
第一次实例化Son============================
C#编译器缺省将每一个成员变量初始化为他的默认值
Son静态字段 :
Son静态构造函数
Son非静态变量
Father静态字段
Father静态构造函数
Father非静态变量
Father 构造函数
Son构造函数
Son对象初始值设定项
类初始化和对象(实例化)完成
第N次(N>1)的实例化Son============================
Son非静态变量
Father非静态变量
Father 构造函数
Son构造函数
Son对象初始值设定项
对象初始化(实例化)完成
具体代码如下:
public struct MBase { public MBase(string name) { Console.WriteLine($"{name}"); } } public class Father { public MBase name2 = new MBase("Father字段 "); public static MBase name1 = new MBase("Father静态字段 "); public static string Name; public static MBase Name1 { get => name1; set => name1 = value; } static Father() { Name = "Father静态构造函数"; Console.WriteLine(Name); } public Father() { Name = "Father 构造函数"; Console.WriteLine(Name); } } public class Son : Father { public static MBase Age1 = new MBase("Son静态字段 "); public MBase Age2 = new MBase("Son字段 "); public static MBase Age3; public static string Age = "12 const"; public readonly string A1 = "10"; public Son(string a) { A1 = a; Age = "Son构造函数"+a; Console.WriteLine(Age); } static Son() { Age = "Son静态构造函数"; Console.WriteLine(Age); } public string B { get => A1; init { A1 = value; Console.WriteLine("Son对象 "); } } } public class Test { static void Main(string[] args) { Console.WriteLine("第一次实例化Son============================"); Console.WriteLine("C#编译器缺省将每一个成员变量初始化为他的默认值"); Son a = new Son("a") { B = "A" }; Console.WriteLine(); Console.WriteLine("第N次(N>1)的实例化Son============================"); Son b = new Son("a") { B = "A" }; Console.ReadKey(); } }
编程是个人爱好