C#中Class的實例化過程詳解
前言
在平常開發(fā)的過程中,經(jīng)常需要new 一個class,但是呢,由于忽略一些基礎(chǔ)語法知識,不了解各成員的實例化順序,導(dǎo)致代碼中一些不必要的錯誤,所以在此做個總結(jié)!
一、class的成員
class 中的成員有:字段、常量、屬性、方法、構(gòu)造函數(shù)、事件、終結(jié)器、索引器、運算符、嵌套類型
關(guān)于成員詳情可查:成員(C# 編程指南)
另外本文實例化過程會著重說明:靜態(tài)字段,靜態(tài)構(gòu)造函數(shù),實例字段,屬性,構(gòu)造函數(shù) 等幾個常用成員的初始化過程。
二、實例化順序(無繼承情況)
在當(dāng)前實例化的過程中也會分兩種情況,
- 一種就是直接在聲明變量的時候就初始化,如
private object obj = new object(); - 另一種就是申明的時候只管聲明,初始化的工作均在構(gòu)造函數(shù)中完成,如
private object obj ;
1.聲明時進行初始化
代碼如下(示例):
//該類僅用于打印實例化時候的信息,用于標(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("進入get設(shè)置器");
return _info;
}
set
{
Console.WriteLine("進入set設(shè)置器");
_info = value;
}
}
static User()
{
Console.WriteLine("靜態(tài)構(gòu)造函數(shù)正在執(zhí)行");
}
public User()
{
Console.WriteLine("構(gòu)造函數(shù)正在執(zhí)行");
}
}
通過實例化User類,觀察實例化過程:
static void Main(string[] args)
{
User user = new User();
Console.WriteLine("獲取屬性"+user.Info);
user.Info = new Msg("使用屬性");
Console.ReadLine();
}

通過以上案例可知實例化過程為:
- 靜態(tài)字段
- 靜態(tài)構(gòu)造函數(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("進入get設(shè)置器");
return _info;
}
set
{
Console.WriteLine("進入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("實例字段初始化");
}
}

通過以上案例可知實例化過程為:
- 在構(gòu)造函數(shù)外初始化的順序,仍舊是 靜態(tài)字段=》靜態(tài)構(gòu)造函數(shù)=》實例字段=》構(gòu)造函數(shù)
- 在構(gòu)造函數(shù)之內(nèi)的初始化順序,就是按照代碼的編寫順序執(zhí)行。
- 屬性則是在使用時會被初始化
三、實例化順序(有繼承情況)
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("進入get設(shè)置器");
return _info;
}
set
{
Console.WriteLine("進入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("子類 實例字段初始化");
private Msg _vipInfo;
public Msg VipInfo
{
get
{
Console.WriteLine("進入get設(shè)置器");
return _vipInfo;
}
set
{
Console.WriteLine("進入set設(shè)置器");
_vipInfo = value;
}
}
public VipUser()
{
Console.WriteLine("子類 構(gòu)造函數(shù)初始化完成");
}
}
static void Main(string[] args)
{
VipUser user = new VipUser();
Console.ReadLine();
}

通過以上案例可知實例化過程為:
- 先初始化子類的靜態(tài)成員:靜態(tài)字段=》靜態(tài)構(gòu)造函數(shù)
- 再實例化子類的實例成員:實例字段
- 再初始化父類的靜態(tài)成員:靜態(tài)字段=》靜態(tài)構(gòu)造函數(shù)
- 再實例化父類的實例成員:實例字段
- 再實例化父類的構(gòu)造函數(shù)
- 最后實例化子類的構(gòu)造函數(shù)
結(jié)語
到此這篇關(guān)于C#中Class的實例化過程詳解的文章就介紹到這了,更多相關(guān)C# Class實例化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中String和StringBuilder的簡介與區(qū)別
今天小編就為大家分享一篇關(guān)于C#中String和StringBuilder的簡介與區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10

