C#中Class的實(shí)例化過程詳解
前言
在平常開發(fā)的過程中,經(jīng)常需要new 一個class,但是呢,由于忽略一些基礎(chǔ)語法知識,不了解各成員的實(shí)例化順序,導(dǎo)致代碼中一些不必要的錯誤,所以在此做個總結(jié)!
一、class的成員
class 中的成員有:字段、常量、屬性、方法、構(gòu)造函數(shù)、事件、終結(jié)器、索引器、運(yùn)算符、嵌套類型
關(guān)于成員詳情可查:成員(C# 編程指南)
另外本文實(shí)例化過程會著重說明:靜態(tài)字段,靜態(tài)構(gòu)造函數(shù),實(shí)例字段,屬性,構(gòu)造函數(shù) 等幾個常用成員的初始化過程。
二、實(shí)例化順序(無繼承情況)
在當(dāng)前實(shí)例化的過程中也會分兩種情況,
- 一種就是直接在聲明變量的時候就初始化,如
private object obj = new object();
- 另一種就是申明的時候只管聲明,初始化的工作均在構(gòu)造函數(shù)中完成,如
private object obj ;
1.聲明時進(jìn)行初始化
代碼如下(示例):
//該類僅用于打印實(shí)例化時候的信息,用于標(biāo)記過程 public class Msg { public Msg(string info) { Console.WriteLine(info); } }
public class User { public static Msg StaticField = new Msg("靜態(tài)字段初始化"); private Msg privateField = new Msg("私有字段初始化"); private Msg _info; public Msg Info { get { Console.WriteLine("進(jìn)入get設(shè)置器"); return _info; } set { Console.WriteLine("進(jìn)入set設(shè)置器"); _info = value; } } static User() { Console.WriteLine("靜態(tài)構(gòu)造函數(shù)正在執(zhí)行"); } public User() { Console.WriteLine("構(gòu)造函數(shù)正在執(zhí)行"); } }
通過實(shí)例化User類,觀察實(shí)例化過程:
static void Main(string[] args) { User user = new User(); Console.WriteLine("獲取屬性"+user.Info); user.Info = new Msg("使用屬性"); Console.ReadLine(); }
通過以上案例可知實(shí)例化過程為:
- 靜態(tài)字段
- 靜態(tài)構(gòu)造函數(shù)
- 實(shí)例字段
- 構(gòu)造函數(shù)
- 屬性則是在使用時會被初始化
2.在構(gòu)造函數(shù)中初始化
在聲明時不再初始化,統(tǒng)一在構(gòu)造函數(shù)中初始化
public class User { public static Msg StaticField ; private Msg privateField; private Msg _info; public Msg Info { get { Console.WriteLine("進(jìn)入get設(shè)置器"); return _info; } set { Console.WriteLine("進(jìn)入set設(shè)置器"); _info = value; } } static User() { Console.WriteLine("靜態(tài)構(gòu)造函數(shù)正在執(zhí)行"); } public User() { Console.WriteLine("構(gòu)造函數(shù)正在執(zhí)行"); StaticField = new Msg("靜態(tài)字段初始化"); privateField = new Msg("實(shí)例字段初始化"); } }
通過以上案例可知實(shí)例化過程為:
- 在構(gòu)造函數(shù)外初始化的順序,仍舊是 靜態(tài)字段=》靜態(tài)構(gòu)造函數(shù)=》實(shí)例字段=》構(gòu)造函數(shù)
- 在構(gòu)造函數(shù)之內(nèi)的初始化順序,就是按照代碼的編寫順序執(zhí)行。
- 屬性則是在使用時會被初始化
三、實(shí)例化順序(有繼承情況)
public class User { public static Msg StaticField = new Msg("父類 靜態(tài)字段初始化"); private Msg privateField = new Msg("父類 實(shí)例字段初始化"); private Msg _info; public Msg Info { get { Console.WriteLine("進(jìn)入get設(shè)置器"); return _info; } set { Console.WriteLine("進(jìn)入set設(shè)置器"); _info = value; } } static User() { Console.WriteLine("父類 靜態(tài)構(gòu)造函數(shù)正在執(zhí)行"); } public User() { Console.WriteLine("父類 構(gòu)造函數(shù)正在執(zhí)行"); } } public class VipUser : User { public static Msg StaticVipField = new Msg("子類 靜態(tài)字段初始化"); private Msg privateVipField = new Msg("子類 實(shí)例字段初始化"); private Msg _vipInfo; public Msg VipInfo { get { Console.WriteLine("進(jìn)入get設(shè)置器"); return _vipInfo; } set { Console.WriteLine("進(jìn)入set設(shè)置器"); _vipInfo = value; } } public VipUser() { Console.WriteLine("子類 構(gòu)造函數(shù)初始化完成"); } }
static void Main(string[] args) { VipUser user = new VipUser(); Console.ReadLine(); }
通過以上案例可知實(shí)例化過程為:
- 先初始化子類的靜態(tài)成員:靜態(tài)字段=》靜態(tài)構(gòu)造函數(shù)
- 再實(shí)例化子類的實(shí)例成員:實(shí)例字段
- 再初始化父類的靜態(tài)成員:靜態(tài)字段=》靜態(tài)構(gòu)造函數(shù)
- 再實(shí)例化父類的實(shí)例成員:實(shí)例字段
- 再實(shí)例化父類的構(gòu)造函數(shù)
- 最后實(shí)例化子類的構(gòu)造函數(shù)
結(jié)語
到此這篇關(guān)于C#中Class的實(shí)例化過程詳解的文章就介紹到這了,更多相關(guān)C# Class實(shí)例化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中String和StringBuilder的簡介與區(qū)別
今天小編就為大家分享一篇關(guān)于C#中String和StringBuilder的簡介與區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10