C#靜態(tài)構(gòu)造函數(shù)用法實(shí)例分析
本文實(shí)例講述了C#靜態(tài)構(gòu)造函數(shù)用法。分享給大家供大家參考。具體如下:
當(dāng)我們想初始化一些靜態(tài)變量的時候,就需要用到靜態(tài)構(gòu)造函數(shù)了。這個靜態(tài)構(gòu)造函數(shù)屬于類,而不屬于實(shí)例,就是說這個構(gòu)造函數(shù)只會被執(zhí)行一次,即:在創(chuàng)建第一個實(shí)例或引用任何靜態(tài)成員之前,由.NET自動調(diào)用。
現(xiàn)在碰到這樣一個場景:提供一個靜態(tài)方法,這個靜態(tài)方法在不同的地方使用,涉及到一個參數(shù)值不同,而其他內(nèi)容都完全一致。如果是將靜態(tài)方法的內(nèi)容復(fù)制出來做成另外一個方法,代碼冗余太多,做法不可取。使用靜態(tài)構(gòu)造函數(shù)處理靜態(tài)變量,則可以盡最大程度簡化代碼。如下示例:
/// <summary>
/// 基類
/// </summary>
public class A
{
public static string Field = "original-test";
//靜態(tài)構(gòu)造函數(shù)
static A()
{
Field = "test-a";
}
public static void Test()
{
Console.WriteLine("the output is : " + Field);
}
}
/// <summary>
/// 子類
/// </summary>
public class B : A
{
//靜態(tài)構(gòu)造函數(shù)
static B()
{
Field = "test-b";
}
public static new void Test()
{
A.Test();
//調(diào)用基類方法,這個對基類Test函數(shù)的覆蓋很重要,沒有這個,那么調(diào)用B.Test()的時候其實(shí)是調(diào)用基類的Test方法。
}
}
如代碼所示,類型B繼承于基類型A。B中的靜態(tài)構(gòu)造函數(shù)對靜態(tài)變量Field進(jìn)行賦值,這個會在調(diào)用子類中的Test方法之前調(diào)用,而B中Test方法的實(shí)現(xiàn)則是完全調(diào)用基類A的Test方法,這樣,在方法執(zhí)行的時候,方法中使用的靜態(tài)變量Field的值就是在B的靜態(tài)構(gòu)造函數(shù)中賦值之后的test-b。
調(diào)用結(jié)果如下:
static void Main(string[] args)
{
A.Test();//輸出the output is : test-a
B.Test();//輸出the output is : test-b
Console.ReadLine();
}
A.Test()調(diào)用,F(xiàn)ield值為test-a;而B.Test()調(diào)用,F(xiàn)ield值為test-b。
這樣,當(dāng)靜態(tài)方法的實(shí)現(xiàn)邏輯復(fù)雜的時候,就可以針對需要將這個方法進(jìn)行個性化實(shí)現(xiàn)的需求的時候簡化代碼:子類在靜態(tài)構(gòu)造函數(shù)中對靜態(tài)變量重新賦值,然后重新實(shí)現(xiàn)基類中的靜態(tài)方法。
(注意,后面的重新實(shí)現(xiàn)基類中的靜態(tài)方法是必須的,否則輸出B.Test()的時候,調(diào)用基類的Test()方法,使用的Field變量則是基類中的變量,那時輸出則變成如下:)
static void Main(string[] args)
{
A.Test();//輸出the output is : test-a
B.Test();//輸出the output is : test-a。
//因?yàn)闆]有覆蓋子類方法,等同于A.Test()
Console.ReadLine();
}
希望本文所述對大家的C#程序設(shè)計(jì)有所幫助。
- C#構(gòu)造函數(shù)詳解
- C# 構(gòu)造函數(shù)如何調(diào)用虛方法
- 淺談C# 構(gòu)造方法(函數(shù))
- C#類繼承中構(gòu)造函數(shù)的執(zhí)行序列示例詳解
- C#中構(gòu)造函數(shù)和析構(gòu)函數(shù)用法實(shí)例詳解
- 詳解C#編程中構(gòu)造函數(shù)的使用
- C#中靜態(tài)構(gòu)造函數(shù)的幾點(diǎn)說明介紹
- C#私有構(gòu)造函數(shù)使用示例
- c#只讀字段和常量的區(qū)別,以及靜態(tài)構(gòu)造函數(shù)的使用實(shí)例
- C# 靜態(tài)構(gòu)造函數(shù)使用總結(jié)
- C#構(gòu)造函數(shù)在基類和父類中的執(zhí)行順序
相關(guān)文章
c#數(shù)據(jù)庫與TXT導(dǎo)入導(dǎo)出的實(shí)例
最近剛學(xué)完ADO.NET,做了個數(shù)據(jù)導(dǎo)入導(dǎo)出的題目,是將txt中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫,然后將數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出到txt中,這里說的數(shù)據(jù)的格式是“tom|23”,tom指名字,23指年齡。廢話也不多說了,大家直接看代碼。2013-04-04
C#模擬http 發(fā)送post或get請求的簡單實(shí)例
下面小編就為大家?guī)硪黄狢#模擬http 發(fā)送post或get請求的簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
C#實(shí)現(xiàn)Check Password和鎖定輸錯密碼鎖定賬戶功能
C#實(shí)現(xiàn)的Check Password,并根據(jù)輸錯密碼的次數(shù)分情況鎖定賬戶:如果輸入錯誤3次,登錄賬戶鎖定5分鐘并提示X點(diǎn)X分后重試登錄,具體實(shí)現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧2020-01-01
C# .NET中Socket簡單實(shí)用框架的使用教程
最近一個項(xiàng)目因?yàn)橐玫絊ocket傳輸問題,所以決定學(xué)習(xí)一下,將自己學(xué)習(xí)的內(nèi)容總結(jié)分享出來,下面這篇文章主要給大家介紹了關(guān)于C# .NET中Socket簡單實(shí)用框架使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-09-09

