总结结果:
对于一个类执行顺序:
隐式静态变量初始化、静态函数初始化(隐式调用静态构造函数情况下,会在程序运行开头执行)>显式静态变量初始化、静态函数初始化(显式调用静态构造函数情况下,在使用类名时候就进行初始化操作)>静态构造函数执行>类实例化>变量初始化>函数初始化>构造函数初始化
总结:
对于静态调用和实例化调用,执行顺序“先静态域,后实例化域,先隐式,后显式”
对于变量、函数、构造函数执行顺序“先变量声明、再函数声明、最后构造函数”
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StaticClassDemo { //该类为隐式调用构造函数,会在访问StaticClassA类名之前运行, public class StaticClassA { public string staticMem = ShowStaticStr("A Static Member"); public static string ShowStaticStr(string message) { Console.WriteLine(message); return message; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StaticClassDemo { public class StaticClassB { //该类中有隐式调用静态函数 public static string staticMem = ShowStaticStr("B Static Member"); public static string ShowStaticStr(string message) { Console.WriteLine(message); return message; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StaticClassDemo { //该类中有显式调用静态函数 public class StaticClassC { public static string staticMem = ShowStaticStr("C Static Member"); public static string ShowStaticStr(string message) { Console.WriteLine(message); return message; } static StaticClassC() { Console.WriteLine("静态构造函数C执行"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StaticClassDemo { class StaticClassD { public string staticMem = ShowStaticStr("D Static Member"); public static string ShowStaticStr(string message) { Console.WriteLine(message); return message; } static StaticClassD() { Console.WriteLine("静态构造函数D执行"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StaticClassDemo { public class StaticClassE { public static string staticName = "E static Member static Name"; public string Name = ShowStaticStr("E Static Member Name"); public StaticClassE() { Console.WriteLine("完成初始化E"); } public static string ShowStaticStr(string message) { Console.WriteLine(message); return message; } public string ShowStr(string message) { Console.WriteLine(message); return message; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StaticClassDemo { class Program { static void Main(string[] args) { //StaticClassA 静态字段 //C#构造函数分为静态构造函数和实例构造函数。 //静态构造函数会在类的静态变量、方法等静态属性生成之后或者在new一个新的对象之前时被调用,隐式构造函数的类的静态变量、静态函数初始化会在程序开始之前执行 //实例构造函数在new一个新的对象时执行 //执行顺序:1.执行B类静态变量初始化生成(B类为隐式静态函数,B类的静态变量先初始化生成) Console.WriteLine("A EntryPoint"); //执行顺序:2.执行A类变量初始化生成(A该类为隐式静态函数,但A类的变量为非静态,所以在B类静态变量初始化之后,变量、函数调用之前生成),再执行A类实例化调用staticMem变量 Console.WriteLine(new StaticClassA().staticMem); //执行顺序:3.执行A类静态方法 StaticClassA.ShowStaticStr("Call A Static Method"); Console.WriteLine("************************************************************"); //执行顺序:4.执行B类静态字段调用显示(B类为隐式静态函数,在程序开始之前最先初始化了B类的静态变量) Console.WriteLine(" B EntryPoint"); Console.WriteLine(StaticClassB.staticMem); //执行顺序:5.执行B类静态方法 StaticClassB.ShowStaticStr("Call B Static Method"); Console.WriteLine("************************************************************"); Console.WriteLine("C EntryPoint"); //执行顺序:6.执行C类静态字段初始化显示(C类为显式静态函数,先初始化C类的静态变量,之后才调用C类的构造函数) //执行顺序:7.执行C类静态字段调用显示 Console.WriteLine(StaticClassC.staticMem); //执行顺序:8.执行C类静态函数调用 StaticClassC.ShowStaticStr("Call C Static Method"); Console.WriteLine("************************************************************"); //执行顺序:9.执行D类静态构造函数,因为D类实例化后才能调用非静态变量 Console.WriteLine("D EntryPoint"); //执行顺序:10.执行D类调用变量 Console.WriteLine(new StaticClassD().staticMem); //执行顺序:11.执行D类静态函数调用 StaticClassD.ShowStaticStr("Call D Static Method"); Console.WriteLine("************************************************************"); Console.WriteLine("E EntryPoint"); var e = new StaticClassE(); Console.WriteLine(e.Name); Console.WriteLine(StaticClassE.staticName); Console.WriteLine(e.ShowStr("Call E Method")); Console.WriteLine(StaticClassE.ShowStaticStr("Call E Static Method")); Console.Read(); } } }
运行结果: