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)算符、嵌套類(lèi)型
關(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)行初始化
代碼如下(示例):
//該類(lèi)僅用于打印實(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類(lèi),觀察實(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)的初始化順序,就是按照代碼的編寫(xiě)順序執(zhí)行。
- 屬性則是在使用時(shí)會(huì)被初始化
三、實(shí)例化順序(有繼承情況)
public class User
{
public static Msg StaticField = new Msg("父類(lèi) 靜態(tài)字段初始化");
private Msg privateField = new Msg("父類(lèi) 實(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("父類(lèi) 靜態(tài)構(gòu)造函數(shù)正在執(zhí)行");
}
public User()
{
Console.WriteLine("父類(lèi) 構(gòu)造函數(shù)正在執(zhí)行");
}
}
public class VipUser : User
{
public static Msg StaticVipField = new Msg("子類(lèi) 靜態(tài)字段初始化");
private Msg privateVipField = new Msg("子類(lèi) 實(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("子類(lèi) 構(gòu)造函數(shù)初始化完成");
}
}
static void Main(string[] args)
{
VipUser user = new VipUser();
Console.ReadLine();
}

通過(guò)以上案例可知實(shí)例化過(guò)程為:
- 先初始化子類(lèi)的靜態(tài)成員:靜態(tài)字段=》靜態(tài)構(gòu)造函數(shù)
- 再實(shí)例化子類(lèi)的實(shí)例成員:實(shí)例字段
- 再初始化父類(lèi)的靜態(tài)成員:靜態(tài)字段=》靜態(tài)構(gòu)造函數(shù)
- 再實(shí)例化父類(lèi)的實(shí)例成員:實(shí)例字段
- 再實(shí)例化父類(lèi)的構(gòu)造函數(shù)
- 最后實(shí)例化子類(lèi)的構(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#代碼實(shí)現(xiàn)解析WTGPS和BD數(shù)據(jù)
在現(xiàn)代的導(dǎo)航與定位應(yīng)用中,準(zhǔn)確解析 GPS 和北斗(BD)等衛(wèi)星定位數(shù)據(jù)至關(guān)重要,本文將使用C#語(yǔ)言實(shí)現(xiàn)解析WTGPS和BD數(shù)據(jù),需要的可以了解下2025-06-06
C# WinForm程序設(shè)計(jì)簡(jiǎn)單計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C# WinForm程序設(shè)計(jì)簡(jiǎn)單計(jì)算器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
基于C#實(shí)現(xiàn)的輕量級(jí)多線程隊(duì)列圖文詳解
這篇文章主要給大家介紹了關(guān)于基于C#實(shí)現(xiàn)的輕量級(jí)多線程隊(duì)列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
C# IP地址與整數(shù)之間轉(zhuǎn)換的具體方法
這篇文章介紹了C# IP地址與整數(shù)之間轉(zhuǎn)換的具體方法,有需要的朋友可以參考一下2013-10-10

