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

通過(guò)以上案例可知實(shí)例化過(guò)程為:
- 靜態(tài)字段
- 靜態(tài)構(gòu)造函數(shù)
- 實(shí)例字段
- 構(gòu)造函數(shù)
- 屬性則是在使用時(shí)會(huì)被初始化
2.在構(gòu)造函數(shù)中初始化
在聲明時(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í)例字段初始化");
}
}

通過(guò)以上案例可知實(shí)例化過(guò)程為:
- 在構(gòu)造函數(shù)外初始化的順序,仍舊是 靜態(tài)字段=》靜態(tài)構(gòu)造函數(shù)=》實(shí)例字段=》構(gòu)造函數(shù)
- 在構(gòu)造函數(shù)之內(nèi)的初始化順序,就是按照代碼的編寫順序執(zhí)行。
- 屬性則是在使用時(shí)會(huì)被初始化
三、實(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();
}

通過(guò)以上案例可知實(shí)例化過(guò)程為:
- 先初始化子類的靜態(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é)語(yǔ)
到此這篇關(guān)于C#中Class的實(shí)例化過(guò)程詳解的文章就介紹到這了,更多相關(guān)C# Class實(shí)例化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#學(xué)習(xí)基礎(chǔ)概念二十五問(wèn)
C#學(xué)習(xí)基礎(chǔ)概念二十五問(wèn)...2007-04-04
C#中String和StringBuilder的簡(jiǎn)介與區(qū)別
今天小編就為大家分享一篇關(guān)于C#中String和StringBuilder的簡(jiǎn)介與區(qū)別,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
利用C#編寫一個(gè)Windows服務(wù)程序的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C#編寫一個(gè)Windows服務(wù)程序,文中的實(shí)現(xiàn)方法講解詳細(xì),具有一定的參考價(jià)值,感興趣的可以了解一下2023-03-03

