C#靜態(tài)static的用法實(shí)例分析
本文實(shí)例講述了C#靜態(tài)static的用法,分享給大家供大家參考。具體用法分析如下:
一、靜態(tài)類
靜態(tài)類與非靜態(tài)類的重要區(qū)別在于靜態(tài)類不能實(shí)例化,也就是說(shuō),不能使用 new 關(guān)鍵字創(chuàng)建靜態(tài)類類型的變量。在聲明一個(gè)類時(shí)使用static關(guān)鍵字,具有兩個(gè)方面的意義:首先,它防止程序員寫(xiě)代碼來(lái)實(shí)例化該靜態(tài)類;其次,它防止在類的內(nèi)部聲明任何實(shí)例字段或方法。
靜態(tài)類的主要特性:
1:僅包含靜態(tài)成員。
2:無(wú)法實(shí)例化。
3:靜態(tài)類的本質(zhì),是一個(gè)抽象的密封類,所以不能被繼承,也不能被實(shí)例化。
4:不能包含實(shí)例構(gòu)造函數(shù)。
5:如果一個(gè)類下面的所有成員,都需要被共享,那么可以把這個(gè)類定義為靜態(tài)類。
靜態(tài)類與私有構(gòu)造函數(shù)區(qū)別:
1、私有構(gòu)造器方式仍然可以從類的內(nèi)部對(duì)類進(jìn)行實(shí)例化,而靜態(tài)類禁止從任何地方實(shí)例化類,其中包括從類自身內(nèi)部。
2、使用私有構(gòu)造器的類中,是允許有實(shí)例成員的,編譯器不允許靜態(tài)類有任何實(shí)例成員。
3、使用靜態(tài)類的優(yōu)點(diǎn)在于,編譯器能夠執(zhí)行檢查以確保不致偶然地添加實(shí)例成員,編譯器將保證不會(huì)創(chuàng)建此 類的實(shí)例。
4、C#編譯器會(huì)自動(dòng)把它標(biāo)記為sealed。這個(gè)關(guān)鍵字將類指定為不可擴(kuò)展;換言之,不能從它派生出其他類。
二、靜態(tài)變量
1、通過(guò)static關(guān)鍵字修飾,是屬于類,實(shí)例成員屬于對(duì)象,在這個(gè)類第一次加載的時(shí)候,這個(gè)類下面的所有靜態(tài)成員會(huì)被加載。
2、靜態(tài)成員只被創(chuàng)建一次,所以靜態(tài)成員只有一份,實(shí)例成員有多少個(gè)對(duì)象,就有多少份。
3、類加載的時(shí)候,所有的靜態(tài)成員就會(huì)被創(chuàng)建在“靜態(tài)存儲(chǔ)區(qū)”里面,一旦創(chuàng)建直到程序退出,才會(huì)被回收。
4、變量需要被共享的時(shí)候,方法需要被反復(fù)調(diào)用的時(shí)候,就可以把這些成員定義為靜態(tài)成員。
5、在靜態(tài)方法中,不能直接調(diào)用實(shí)例成員,因?yàn)殪o態(tài)方法被調(diào)用的時(shí)候,對(duì)象還有可能不存在。
6、this/base 關(guān)鍵字在靜態(tài)方法中不能使用,因?yàn)橛锌赡軐?duì)象還不存在。
7、可以創(chuàng)建這個(gè)類的對(duì)象,制定對(duì)象的成員在靜態(tài)方法中操作。
8、在實(shí)例方法中,可以調(diào)用靜態(tài)成員,因?yàn)檫@個(gè)時(shí)候靜態(tài)成員肯定存在。
9、非靜態(tài)類可以包含靜態(tài)的方法、字段、屬性或事件;
10、無(wú)論對(duì)一個(gè)類創(chuàng)建多少個(gè)實(shí)例,它的靜態(tài)成員都只有一個(gè)副本;
11、靜態(tài)方法和屬性不能訪問(wèn)其包含類型中的非靜態(tài)字段和事件,并且不能訪問(wèn)任何對(duì)象的實(shí)例變量;
12、靜態(tài)方法只能被重載,而不能被重寫(xiě),因?yàn)殪o態(tài)方法不屬于類的實(shí)例成員;
13、雖然字段不能聲明為 static const,但 const 字段的行為在本質(zhì)上是靜態(tài)的。這樣的字段屬于類,不屬于類的實(shí)例。
三、靜態(tài)方法
靜態(tài)方法是不屬于特定對(duì)象的方法,
靜態(tài)方法可以訪問(wèn)靜態(tài)成員變量,
靜態(tài)方法不可以直接訪問(wèn)實(shí)例變量,可以在實(shí)例函數(shù)調(diào)用的情況下,實(shí)例變 量做為參數(shù)傳給靜態(tài)方法。
靜態(tài)方法也不能直接調(diào)用實(shí)例方法,可以間接調(diào)用,首先要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,然后通過(guò)這一特定對(duì)象來(lái)調(diào)用靜態(tài)方法。
四、靜態(tài)構(gòu)造函數(shù)
1:靜態(tài)類可以有靜態(tài)構(gòu)造函數(shù),靜態(tài)構(gòu)造函數(shù)不可繼承;
2:靜態(tài)構(gòu)造函數(shù)可以用于靜態(tài)類,也可用于非靜態(tài)類;
3:靜態(tài)構(gòu)造函數(shù)無(wú)訪問(wèn)修飾符、無(wú)參數(shù),只有一個(gè) static 標(biāo)志;
4:靜態(tài)構(gòu)造函數(shù)不可被直接調(diào)用,當(dāng)創(chuàng)建類實(shí)例或引用任何靜態(tài)成員之前,靜態(tài)構(gòu)造函數(shù)被自動(dòng)執(zhí)行,并且只執(zhí)行一次。
例如
{
public static int i =0;
public Program()
{
i = 1;
Console.Write("實(shí)例構(gòu)造方法被調(diào)用");
}
static Program()
{
i = 2;
Console.Write("靜態(tài)構(gòu)造函數(shù)被執(zhí)行");
}
static void Main(string[] args)
{
Console.Write(Program.i);//結(jié)果為2,首先,類被加載,所有的靜態(tài)成員被創(chuàng)建在靜態(tài)存儲(chǔ)區(qū),i=0,接著調(diào)用了類的成員,這時(shí)候靜態(tài)構(gòu)造函數(shù)就會(huì)被調(diào)用,i=2
Program p = new Program();
Console.Write(Program.i);//結(jié)果為1,實(shí)力化后,調(diào)用了實(shí)例構(gòu)造函數(shù),i=1,因?yàn)殪o態(tài)構(gòu)造函數(shù)只執(zhí)行一次,所以不會(huì)再執(zhí)行。
}
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
c#關(guān)于非托管內(nèi)存的釋放問(wèn)題及解讀
這篇文章主要介紹了c#關(guān)于非托管內(nèi)存的釋放問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02C#鍵盤(pán)輸入回車鍵實(shí)現(xiàn)點(diǎn)擊按鈕效果的方法
這篇文章主要介紹了C#鍵盤(pán)輸入回車鍵實(shí)現(xiàn)點(diǎn)擊按鈕效果的方法,可實(shí)現(xiàn)用回車鍵代替點(diǎn)擊按鈕的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09C#實(shí)現(xiàn)條形碼識(shí)別的解決方案分享
主流的識(shí)別庫(kù)主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR碼檢測(cè)和解碼功能,所以本文主要和大家分享了使用ZBar進(jìn)行條形碼識(shí)別的示例代碼,需要的可以參考一下2023-07-07C#從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)到DataSet并保存到xml文件的方法
這篇文章主要介紹了C#從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)到DataSet并保存到xml文件的方法,涉及C#操作DataSet保存到XML文件的技巧,需要的朋友可以參考下2015-04-04C# 正則判斷一個(gè)數(shù)字的格式是否有逗號(hào)的代碼
c#正則判斷一個(gè)格式化數(shù)字里是否有逗號(hào)的解決方法2008-07-07C#實(shí)現(xiàn)多文件打包壓縮(.Net?Core)
本文詳細(xì)講解了.Net?Core框架下C#實(shí)現(xiàn)多文件打包壓縮的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12