前言
本節(jié)主要來(lái)學(xué)習(xí)下實(shí)例構(gòu)造函數(shù)、私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)。
構(gòu)造函數(shù)的作用:
1、當(dāng)一個(gè)類(lèi)在new實(shí)例化對(duì)象時(shí),可調(diào)用構(gòu)造函數(shù)進(jìn)行初始化對(duì)象。
2、不帶參數(shù)的構(gòu)造函數(shù)稱(chēng)為“默認(rèn)構(gòu)造函數(shù)”。無(wú)論何時(shí),只要使用new運(yùn)算符實(shí)例化對(duì)象,并且不為new提供任何參數(shù),就會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。除非類(lèi)是static的,否則 C# 編譯 器將為無(wú)構(gòu)造函數(shù)的類(lèi)提供一個(gè)公共的默認(rèn)構(gòu)造函數(shù),以便該類(lèi)可以實(shí)例化。
3、通過(guò)將構(gòu)造函數(shù)設(shè)置為私有構(gòu)造函數(shù)可以阻止類(lèi)被實(shí)例化。
4、結(jié)構(gòu)類(lèi)型的構(gòu)造函數(shù)與類(lèi)的構(gòu)造函數(shù)類(lèi)似,但是 structs 不能包含顯式默認(rèn)構(gòu)造函數(shù),因?yàn)榫幾g器將自動(dòng)提供一個(gè)構(gòu)造函數(shù)。此構(gòu)造函數(shù)會(huì)將struct中的每個(gè)字段初始化為默認(rèn)值。 只有當(dāng) struct 用 new 實(shí)例化時(shí),才會(huì)調(diào)用此默認(rèn)構(gòu)造函數(shù)。
實(shí)例構(gòu)造函數(shù)
使用 new 表達(dá)式創(chuàng)建某個(gè)類(lèi)的對(duì)象時(shí),會(huì)使用實(shí)例構(gòu)造函數(shù)創(chuàng)建和初始化所有實(shí)例成員變量。 要初始化靜態(tài)類(lèi)或非靜態(tài)類(lèi)中的靜態(tài)變量,必須定義靜態(tài)構(gòu)造函數(shù)。
class CoOrds{ public int x, y; // constructor public CoOrds() { x = 0; y = 0; }}只要?jiǎng)?chuàng)建基于CoOrds類(lèi)的對(duì)象,就會(huì)調(diào)用此實(shí)例構(gòu)造函數(shù)。諸如此類(lèi)不帶參數(shù)的構(gòu)造函數(shù)稱(chēng)為“默認(rèn)構(gòu)造函數(shù)”。然而,提供其他構(gòu)造函數(shù)通常十分有用。例如,可以向CoOrds類(lèi)添加構(gòu)造函數(shù),以便可以為數(shù)據(jù)成員指定初始值:
public CoOrds(int x, int y){ this.x = x; this.y = y;}這樣便可以用默認(rèn)或特定的初始值創(chuàng)建CoOrd對(duì)象,如下所示:
CoOrds p1 = new CoOrds();CoOrds p2 = new CoOrds(5, 3);
如果某個(gè)類(lèi)沒(méi)有構(gòu)造函數(shù),則會(huì)自動(dòng)生成一個(gè)默認(rèn)構(gòu)造函數(shù),并使用默認(rèn)值來(lái)初始化對(duì)象字段。
也可以用實(shí)例構(gòu)造函數(shù)來(lái)調(diào)用基類(lèi)的實(shí)例構(gòu)造函數(shù)。類(lèi)構(gòu)造函數(shù)可通過(guò)初始值設(shè)定項(xiàng)來(lái)調(diào)用基類(lèi)的構(gòu)造函數(shù),如下所示:
abstract class Shape{ public const double pi = Math.PI; PRotected double x, y; public Shape(double x, double y) { this.x = x; this.y = y; } public abstract double Area();}class Circle : Shape{ public Circle(double radius) : base(radius, 0) { } public override double Area() { return pi * x * x; }}在此示例中,Circle類(lèi)將表示半徑和高度的值傳遞給Shape(Circle從它派生而來(lái))提供的構(gòu)造函數(shù)。
私有構(gòu)造函數(shù)
私有構(gòu)造函數(shù)是一種特殊的實(shí)例構(gòu)造函數(shù)。它通常用在只包含靜態(tài)成員的類(lèi)中。如果類(lèi)具有一個(gè)或多個(gè)私有構(gòu)造函數(shù)而沒(méi)有公共構(gòu)造函數(shù),則其他類(lèi)(除嵌套類(lèi)外)無(wú)法創(chuàng)建該類(lèi)的實(shí)例。例如:
class NLog{ // Private Constructor: private NLog() { } public static double e = Math.E; //2.71828...}聲明空構(gòu)造函數(shù)可阻止自動(dòng)生成默認(rèn)構(gòu)造函數(shù)。 注意,如果您不對(duì)構(gòu)造函數(shù)使用訪問(wèn)修飾符,則在默認(rèn)情況下它仍為私有構(gòu)造函數(shù)。 但是,通常顯式地使用 private 修飾符來(lái)清楚地表明該類(lèi)不能被實(shí)例化。
當(dāng)沒(méi)有實(shí)例字段或?qū)嵗椒ǎㄈ?Math 類(lèi))時(shí)或者當(dāng)調(diào)用方法以獲得類(lèi)的實(shí)例時(shí),私有構(gòu)造函數(shù)可用于阻止創(chuàng)建類(lèi)的實(shí)例。 如果類(lèi)中的所有方法都是靜態(tài)的,可考慮使整個(gè)類(lèi)成為靜態(tài)的。
下面是使用私有構(gòu)造函數(shù)的類(lèi)的示例:
public class Counter { private Counter() { } public static int currentCount; public static int IncrementCount() { return ++currentCount; } } class TestCounter { static void Main() { // Counter aCounter = new Counter(); // Error Counter.currentCount = 100; Counter.IncrementCount(); Console.WriteLine("New count: {0}", Counter.currentCount); Console.WriteLine("Press any key to exit."); Console.ReadKey(); } }注意,如果您取消注釋該示例中的以下語(yǔ)句,它將生成一個(gè)錯(cuò)誤,因?yàn)樵摌?gòu)造函數(shù)受其保護(hù)級(jí)別的限制而不可訪問(wèn):
// Counter aCounter = new Counter(); // Error
靜態(tài)構(gòu)造函數(shù)
靜態(tài)構(gòu)造函數(shù)用于初始化任何 靜態(tài) 數(shù)據(jù),或用于執(zhí)行僅需執(zhí)行一次的特定操作。 在創(chuàng)建第一個(gè)實(shí)例或引用任何靜態(tài)成員之前,將自動(dòng)調(diào)用靜態(tài)構(gòu)造函數(shù)。
class SimpleClass { static readonly long baseline; static SimpleClass() { baseline = DateTime.Now.Ticks; } }靜態(tài)構(gòu)造函數(shù)具有以下特點(diǎn):
靜態(tài)構(gòu)造函數(shù)既沒(méi)有訪問(wèn)修飾符,也沒(méi)有參數(shù)。
在創(chuàng)建第一個(gè)實(shí)例或引用任何靜態(tài)成員之前,將自動(dòng)調(diào)用靜態(tài)構(gòu)造函數(shù)來(lái)初始化類(lèi)。
無(wú)法直接調(diào)用靜態(tài)構(gòu)造函數(shù)。
在程序中,用戶(hù)無(wú)法控制何時(shí)執(zhí)行靜態(tài)構(gòu)造函數(shù)。
靜態(tài)構(gòu)造函數(shù)的典型用途是:當(dāng)類(lèi)使用日志文件時(shí),將使用這種構(gòu)造函數(shù)向日志文件中寫(xiě)入項(xiàng)。
靜態(tài)構(gòu)造函數(shù)在為非托管代碼創(chuàng)建包裝類(lèi)時(shí)也很有用,此時(shí)該構(gòu)造函數(shù)可以調(diào)用LoadLibrary方法。
如果靜態(tài)構(gòu)造函數(shù)引發(fā)異常,運(yùn)行時(shí)將不會(huì)再次調(diào)用該構(gòu)造函數(shù),并且在程序運(yùn)行所在的應(yīng)用程序域的生存期內(nèi),類(lèi)型將保持未初始化。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注