您好,登錄后才能下訂單哦!
小編給大家分享一下c#類成員初始化順序是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!
這里直接給出C#類成員一般初始化順序:
為什么說是“一般”初始化順序呢?因?yàn)楦鶕?jù)類結(jié)構(gòu)的不同,類成員的初始化順序并不是一成不變的。但是這個(gè)順序是基礎(chǔ),可以推導(dǎo)出其他特殊的初始化順序。下面我們就來看兩種特殊的情況:
static void Main(string[] args) { Console.WriteLine("---------------一般初始化順序---------------"); var child1 = new Child1(); Console.WriteLine("\n---------------子類靜態(tài)字段初始化需要使用父類靜態(tài)字段時(shí)初始化順序---------------"); var child2 = new Child2(); Console.WriteLine("\n---------------子類靜態(tài)構(gòu)造函數(shù)中使用父類靜態(tài)字段時(shí)初始化順序---------------"); var child3 = new Child3(); Console.ReadKey(); } public class Child1 : Base1 { public static Display ChildStatic = new Display("Child static filed"); private Display _childFiled = new Display("Child filed"); static Child1() => Console.WriteLine("Child static ctor"); public Child1() => Console.WriteLine("Child ctor"); } public class Child2 : Base2 { /// <summary> /// 子類靜態(tài)字段初始化需要使用父類靜態(tài)字段 /// </summary> public static Display ChildStatic = new Display("Child static filed", () => BaseStatic); private Display _childFiled = new Display("Child filed"); static Child2() => Console.WriteLine("Child static ctor"); public Child2() => Console.WriteLine("Child ctor"); } public class Child3 : Base3 { public static Display ChildStatic = new Display("Child static filed"); private Display _childFiled = new Display("Child filed"); /// <summary> /// 子類靜態(tài)構(gòu)造函數(shù)中使用父類靜態(tài)字段 /// </summary> static Child3() { Console.WriteLine("Child static ctor"); var baseStatic = BaseStatic; } public Child3() => Console.WriteLine("Child ctor"); } /// <summary> /// 3個(gè)Base類相同,這里是為了演示靜態(tài)成員的初始化 /// </summary> public class Base1 { public static Display BaseStatic = new Display("Base static filed"); private Display _baseFiled = new Display("Base filed"); static Base1() => Console.WriteLine("Base static ctor"); public Base1() => Console.WriteLine("Base ctor"); } public class Base2 { public static Display BaseStatic = new Display("Base static filed"); private Display _baseFiled = new Display("Base filed"); static Base2() => Console.WriteLine("Base static ctor"); public Base2() => Console.WriteLine("Base ctor"); } public class Base3 { public static Display BaseStatic = new Display("Base static filed"); private Display _baseFiled = new Display("Base filed"); static Base3() => Console.WriteLine("Base static ctor"); public Base3() => Console.WriteLine("Base ctor"); } public class Display { public Display(string msg, Func<Display> displayFunc = null) { Console.WriteLine(msg); var display = displayFunc?.Invoke(); } }
補(bǔ)充一下:
1. 靜態(tài)構(gòu)造函數(shù)是線程安全的,會(huì)在初次訪問該類所定義的其他方法、屬性或變量之前執(zhí)行
2. 編譯器會(huì)在每個(gè)構(gòu)造函數(shù)(包括靜態(tài)和實(shí)例)的開頭放入適當(dāng)?shù)某绦虼a,以便把你在定義成員字段時(shí)所指定的初始值設(shè)置給這些變量,這就是字段總是在構(gòu)造函數(shù)執(zhí)行前初始化的原因。
3. 無論是靜態(tài)變量還是實(shí)例變量,其取值都應(yīng)該在聲明的時(shí)候得以初始化。但以下3種情況不應(yīng)該編寫初始化語句
通過了解類成員的初始化順序,可以讓我們更加詳細(xì)地了解程序執(zhí)行的細(xì)節(jié),避免寫出類似“在構(gòu)造函數(shù)中調(diào)用虛函數(shù)或抽象函數(shù)”的代碼。
看完了這篇文章,相信你對(duì)c#類成員初始化順序是什么有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。