C#類和結(jié)構(gòu)詳解_第1頁(yè)
C#類和結(jié)構(gòu)詳解_第2頁(yè)
C#類和結(jié)構(gòu)詳解_第3頁(yè)
C#類和結(jié)構(gòu)詳解_第4頁(yè)
C#類和結(jié)構(gòu)詳解_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第C#類和結(jié)構(gòu)詳解目錄一.類1.數(shù)據(jù)成員2.函數(shù)成員(1)方法(2)屬性(property)(3)構(gòu)造函數(shù)3.只讀字段二.匿名類型三.結(jié)構(gòu)(struct)四.類和結(jié)構(gòu)的區(qū)別1.結(jié)構(gòu)是值類型2.結(jié)構(gòu)和繼承3.結(jié)構(gòu)的構(gòu)造函數(shù)五.弱引用六.部分類七.靜態(tài)類八.Object類九.擴(kuò)展方法類和結(jié)構(gòu)實(shí)際上都是創(chuàng)建對(duì)象(實(shí)例)的模版,每個(gè)對(duì)象都包含數(shù)據(jù),并提供了處理和訪問(wèn)數(shù)據(jù)的方法。

類定義了類的每個(gè)對(duì)象可以包含什么數(shù)據(jù)和功能。

classPhoneCus

publicconststringDaySend="Mon";

publicintCusId;

}

結(jié)構(gòu)與類的區(qū)別是它們?cè)趦?nèi)存中的存儲(chǔ)方式,訪問(wèn)方式和它們的一些特性(稍后詳細(xì)介紹它們的區(qū)別)。

較小的數(shù)據(jù)類型使用結(jié)構(gòu)可提高性能,在語(yǔ)法上,比較類似,主要區(qū)別是使用關(guān)鍵字struct代替class來(lái)聲明結(jié)構(gòu)。

structPhoneCusStruct

publicconststringDaySend="Mon";

publicintCusId=;

}

對(duì)于類和結(jié)構(gòu),都是用new來(lái)聲明實(shí)例:這個(gè)關(guān)鍵字創(chuàng)建對(duì)象并對(duì)其進(jìn)行初始化。

PhoneCusmyCus=newPhoneCus();

PhoneCusStructmyCus2=newPhoneCusStruct();

上面的例子,類和結(jié)構(gòu)的字段值都默認(rèn)0.

一.類

類中的數(shù)據(jù)和函數(shù)稱為類的成員(數(shù)據(jù)成員和函數(shù)成員)。

1.數(shù)據(jù)成員

數(shù)據(jù)成員是包含類的數(shù)據(jù)字段,常量和事件的成員。數(shù)據(jù)成員可以是靜態(tài)數(shù)據(jù)。類成員總是實(shí)例成員,除非用static顯示聲明。

2.函數(shù)成員

函數(shù)成員提供了操作類中數(shù)據(jù)的某些功能,包括方法,屬性,構(gòu)造函數(shù),終結(jié)器,運(yùn)算符以及索引。

(1)方法

*C#區(qū)分函數(shù)和方法。C#中函數(shù)包含上述提到的。

*給方法傳遞參數(shù)

參數(shù)可以通過(guò)引用或值傳遞給方法。在變量通過(guò)引用傳遞給方法時(shí),被調(diào)用的方法得到的就是這個(gè)變量,準(zhǔn)確的説就是指向內(nèi)存中變量的指針。所以在方法內(nèi)對(duì)變量進(jìn)行的任何改變?cè)诜椒ㄍ顺龊笕匀挥行А?/p>

而如果變量通過(guò)值傳遞給方法,被調(diào)用的方法得到的是變量的一個(gè)相同副本,也就是說(shuō),在方法退出后,對(duì)變量的修改會(huì)丟失。

對(duì)于復(fù)雜的數(shù)據(jù)類型,按引用傳遞的效率更高,因?yàn)樵诎粗祩鬟f時(shí),必須復(fù)制大量的數(shù)據(jù)。

注意字符串的行為方式有所不同,因?yàn)樽址遣豢勺兊?,所以字符串無(wú)法采用一般引用類型的行為方式。在方法調(diào)用中,對(duì)字符串所做的改變都不會(huì)影響原始字符串。

*ref參數(shù)

像上面所説,值類型通過(guò)值傳遞變量是默認(rèn)的。但也可以迫使值參數(shù)通過(guò)引用傳遞給方法。為此要使用ref關(guān)鍵字。這樣該方法對(duì)變量所做的任何改變都會(huì)影響原始值。

staticvoidSomeFunction(int[]ints,refinti)

ints[0]=100;

i=100;

}

在調(diào)用該方法的時(shí)候,必須添加ref關(guān)鍵字。

SomeFunction(ints,refi);

*out參數(shù)

C#要求變量在被引用前必須用一個(gè)初始值進(jìn)行初始化。但使用out關(guān)鍵字來(lái)初始化可以簡(jiǎn)化C#編譯器所堅(jiān)持的輸入?yún)?shù)的初始化。

在方法的輸入?yún)?shù)前加上out前綴時(shí),傳遞給該方法的變量可以不初始化。而且該變量通過(guò)引用傳遞,所以在從被調(diào)用的方法中返回時(shí),對(duì)應(yīng)方法對(duì)該變量進(jìn)行的任何改變都會(huì)保留下來(lái)。

在調(diào)用該方法時(shí),仍需要使用out關(guān)鍵字:

staticvoidSomeFunction(int[]ints,outinti)

ints[0]=100;

i=100;

SomeFunction(ints,outi);

*命名參數(shù)

參數(shù)一般需要按定義的順序傳遞給方法。命名參數(shù)允許按任意順序傳遞。

stringFullName(stringfirstName,stringlastName)

renturnfirstName+""+lastName;

}

調(diào)用方法:

FullName("John","Doe");

FullName(lastName:"Doe",firstName:"John");

*可選參數(shù)

參數(shù)也可以是可選的。必須為可選參數(shù)提供默認(rèn)值??蛇x參數(shù)還必須是方法定義的最后一個(gè)參數(shù)。

voidTestMethod(intnotOption,intoption=10)

Console.WriteLine(notOption+option);

}

*方法的重載

C#支持方法的重載方法的幾個(gè)版本有不同的簽名(方法名相同,但參數(shù)的個(gè)數(shù)和/或類型不同)。

classMathTest

publicintValue;

publicintGetSquare()

returnValue*Value;

publicintGetSquare(intx)

returnx*x;

}

重載方法在參數(shù)方面的一些限制:

兩個(gè)方法不能僅在返回類型上有區(qū)別;

兩個(gè)方法不能僅根據(jù)參數(shù)是聲明為ref還是out來(lái)區(qū)分。

在任何語(yǔ)言中,對(duì)于方法重載,如果調(diào)用了錯(cuò)誤的重載方法,就有可能出現(xiàn)運(yùn)行錯(cuò)誤。(后面討論如何避免這些錯(cuò)誤)。

(2)屬性(property)

屬性是一個(gè)方法或一對(duì)方法,在客戶端看來(lái),它是一個(gè)字段。

publicstringSomeProperty

return"value";

//設(shè)置屬性值

}

get訪問(wèn)器不帶任何參數(shù),且必須返回屬性聲明的類型。也不應(yīng)為set訪問(wèn)器指定任何顯示參數(shù),編譯器會(huì)

假定它帶一個(gè)參數(shù),器類型也許屬性相同,并表示為value.

privateintage

publicintAge

returnage;

age=valeu;

}

注意所用的命名約定,采用C#的區(qū)分大小寫模式,使用相同的名稱,但公有屬性采用大寫形式命名,如果存在一個(gè)等價(jià)的私有字段,則采用小寫形式命名。

一些開發(fā)人員喜歡使用把下劃線作為前綴的字段名,如_age,這會(huì)為識(shí)別字段提供極大的便利。

*只讀和只寫屬性

在屬性定義中省略set訪問(wèn)器,就會(huì)創(chuàng)建只讀屬性。這樣客戶端代碼只可以讀取該屬性的值,但不能設(shè)置值。

privateintage

publicintAge

returnage;

}

同樣在屬性定義中省略get訪問(wèn)器,就會(huì)創(chuàng)建只寫屬性。

*屬性的訪問(wèn)修飾符

C#允許給屬性的gei和set訪問(wèn)器設(shè)置不同的訪問(wèn)修飾符,所以屬性可以有公有的get訪問(wèn)器和受保護(hù)的set訪問(wèn)器。

在gey和set訪問(wèn)器中,必須有一個(gè)具有屬性的訪問(wèn)級(jí)別(公有)。

*自動(dòng)實(shí)現(xiàn)的屬性

如果屬性的set和get訪問(wèn)器中沒有任何邏輯,就可以使用自動(dòng)實(shí)現(xiàn)的屬性。這種屬性會(huì)自動(dòng)實(shí)現(xiàn)后背成員變量。

publicintAge

get;

set;

}

不需要聲明privateintage;,編譯器會(huì)自動(dòng)創(chuàng)建它。

使用自動(dòng)實(shí)現(xiàn)的屬性,就不能在屬性設(shè)置中驗(yàn)證屬性的有效性。但必須有兩個(gè)訪問(wèn)器,不能把屬性設(shè)置為只讀或只寫。

publicintAge

get;//報(bào)錯(cuò)

但是,每個(gè)訪問(wèn)器的訪問(wèn)級(jí)別可以不同,

publicintAge

get;

privateset;

}

(3)構(gòu)造函數(shù)

聲明基本構(gòu)造函數(shù)就是聲明一個(gè)與包含的類同名的方法,但該方法沒有返回值。

publicclassMyClass

publicMyClass()

}

一般情況下,如果沒有提供任何構(gòu)造函數(shù),編譯器會(huì)在后臺(tái)創(chuàng)建一個(gè)默認(rèn)的構(gòu)造函數(shù)。這是一個(gè)基本的構(gòu)造函數(shù),它只能把所有的成員字段初始化為標(biāo)準(zhǔn)的默認(rèn)值。這通常就足夠了,否則需要編寫自己的構(gòu)造函數(shù)。

構(gòu)造函數(shù)的重載與其它方法的規(guī)則相同??梢詾闃?gòu)造函數(shù)提供任意多的的重載,只要它們的簽名有明顯區(qū)別。

publicclassMyClass

publicMyClass()

publicMyClass(inti)

}

如果提供了帶參數(shù)的構(gòu)造函數(shù),編譯器就不會(huì)自動(dòng)提供默認(rèn)的構(gòu)造函數(shù)。只有在沒有定義任何構(gòu)造函數(shù)的時(shí)候,編譯器才會(huì)自動(dòng)提供默認(rèn)的構(gòu)造函數(shù)。

publicclassMyNum

privateintnumber;

publicMyNum(intnumber)

this.number=number;

}

一般使用this關(guān)鍵字區(qū)分成員字段和同名的參數(shù)。

如果試圖使用無(wú)參數(shù)的構(gòu)造函數(shù)實(shí)例化對(duì)象就會(huì)報(bào)錯(cuò):

MyNumnum=newMyNum();//報(bào)錯(cuò)

可以把構(gòu)造函數(shù)定義為private或protected,這樣不相關(guān)的類就不能訪問(wèn)它們:

publicclassMyNum

privateintnumber;

privateMyNum(intnumber)

this.number=number;

}

上述例子沒有為MyNum定義為任何公有或受保護(hù)的構(gòu)造函數(shù)。這就使MyNum不能使用new運(yùn)算符在外部代碼中實(shí)例化,但可以在MyNum類中編寫一個(gè)公有靜態(tài)屬性或方法,以實(shí)例化該類。

這在下面兩種情況下受有用的:

類僅用作某些靜態(tài)成員或?qū)傩缘娜萜?,因此永遠(yuǎn)不會(huì)實(shí)例化它。

希望類僅通過(guò)某個(gè)靜態(tài)成員函數(shù)來(lái)實(shí)例化。

*靜態(tài)構(gòu)造函數(shù)

C#可以給類編寫無(wú)參數(shù)的靜態(tài)構(gòu)造函數(shù)。這種構(gòu)造函數(shù)只執(zhí)行一次,而前面的構(gòu)造函數(shù)是實(shí)例構(gòu)造函數(shù),只要?jiǎng)?chuàng)建類的對(duì)象,就會(huì)

執(zhí)行它。

classMyClass

staticMyClass()

}

編寫靜態(tài)構(gòu)造函數(shù)的一個(gè)原因是,類有一些靜態(tài)字段或?qū)傩?,需要在第一次使用類之前,從外部源中初始化這些靜態(tài)字段和屬性。

.NET運(yùn)行庫(kù)不能確保什么時(shí)候執(zhí)行靜態(tài)構(gòu)造函數(shù),所以不能把要求在某個(gè)特定時(shí)刻執(zhí)行的代碼放在靜態(tài)構(gòu)造函數(shù)中。也不能預(yù)計(jì)不同類的靜態(tài)構(gòu)造函數(shù)按照什么順序執(zhí)行。但是可以確保靜態(tài)構(gòu)造函數(shù)最多運(yùn)行一次,就在代碼引用類之前調(diào)用它。

在C#中,通常在第一次調(diào)用類的任何成員之前執(zhí)行靜態(tài)構(gòu)造函數(shù)。

注意,靜態(tài)構(gòu)造函數(shù)沒有訪問(wèn)修飾符,其它C#代碼從來(lái)不調(diào)用它,但在加載類時(shí),總是由.NET運(yùn)行庫(kù)調(diào)用它,所以像public,private這樣的訪問(wèn)修飾符就沒有任何意義。出于同樣原因,靜態(tài)構(gòu)造函數(shù)不能帶任何參數(shù),一個(gè)類也只能有一個(gè)靜態(tài)構(gòu)造函數(shù)。很顯然,靜態(tài)構(gòu)造只能訪問(wèn)累的靜態(tài)成員,不能訪問(wèn)類的實(shí)例成員。

無(wú)參數(shù)的實(shí)例構(gòu)造函數(shù)與靜態(tài)構(gòu)造函數(shù)可以在同一個(gè)類中同時(shí)定義。雖然參數(shù)列表相同,但這并不矛盾,因?yàn)樵诩虞d類的時(shí)候執(zhí)行靜態(tài)構(gòu)造函數(shù),在創(chuàng)建實(shí)例時(shí)執(zhí)行實(shí)例構(gòu)造函數(shù),所以何時(shí)執(zhí)行哪個(gè)構(gòu)造函數(shù)不會(huì)有沖突。

如果任何靜態(tài)字段有默認(rèn)值,就在調(diào)用靜態(tài)構(gòu)造函數(shù)之前指定它們。

下面演示靜態(tài)構(gòu)造函數(shù)的用法:

classMainEntryPoint

staticvoidMain()

Console.WriteLine("UserPreference:BackColoris"+UserPreference.BackColor.ToString());

classUserPreference

publicstaticreadonlyColorBackColor;

staticUserPreference()

BackColor=Color.Red;

privateUserPreference()

}

該靜態(tài)變量在靜態(tài)構(gòu)造函數(shù)中進(jìn)行初始化。

*從構(gòu)造函數(shù)中調(diào)用其它構(gòu)造函數(shù)

有時(shí),在一個(gè)類中有幾個(gè)構(gòu)造函數(shù),這些構(gòu)造函數(shù)包含一些共同的代碼。

classCar

privatestringdes;

privateintnWheels;

publicCar(stringdes,intnWheels)

this.des=des;

this.nWheels=nWheels;

publicCar(stringdes)

this.des=des;

this.nWheels=4;

}

這兩個(gè)構(gòu)造函數(shù)初始化了相同的字段,顯然最好把所有的代碼放在一個(gè)地方。C#有一個(gè)特殊的語(yǔ)法,稱為構(gòu)造函數(shù)初始化器,可以實(shí)現(xiàn)這個(gè)目的。

classCar

privatestringdes;

privateintnWheels;

publicCar(stringdes,intnWheels)

this.des=des;

this.nWheels=nWheels;

publicCar(stringdes):this(des,4)

}

這里,this關(guān)鍵字僅調(diào)用參數(shù)最匹配的那個(gè)構(gòu)造函數(shù)。構(gòu)造函數(shù)初始化器在構(gòu)造函數(shù)的函數(shù)體之前執(zhí)行。

C#構(gòu)造函數(shù)初始化器可以包含對(duì)同一個(gè)類的另一個(gè)構(gòu)造函數(shù)的調(diào)用,也可以包含對(duì)直接基類的構(gòu)造函數(shù)的調(diào)用,使用同樣的語(yǔ)法,但應(yīng)用base關(guān)鍵字代替this.初始化器中不能有多個(gè)調(diào)用。

3.只讀字段

常量是一個(gè)包含不能修改的值的變量。但常量不必滿足所有的要求。有時(shí)需要一些一些變量,其值不應(yīng)改變,但在運(yùn)行之前其值是未知的。C#為這種情形提供了另一種類型的變量:只讀字段(readonly)。

readonly關(guān)鍵字比const靈活得多,允許把一個(gè)字段設(shè)置為常量,但可以執(zhí)行一些計(jì)算,以確定它得初始值。

其規(guī)則是可以在構(gòu)造函數(shù)中給只讀字段賦值,但不能在其它地方賦值。只讀字段還可以是一個(gè)實(shí)例字段,類的每個(gè)實(shí)例可以有不同得值。

與const不同,如果要把只讀字段設(shè)置為靜態(tài),就必須顯示得聲明它。

二.匿名類型

var關(guān)鍵字用于表示隱式類型化得變量。var和new關(guān)鍵字一起使用時(shí),可以創(chuàng)建匿名類型。

匿名類型只是一個(gè)繼承自O(shè)bject且沒有名稱的類。

varcaption=new{FirstName="John",LastName="Doe"};

這會(huì)生成一個(gè)包含F(xiàn)irstName,LastName屬性的對(duì)象。

創(chuàng)建另一個(gè)對(duì)象:

vardoctor=new{FirstName="James",LastName="Mc"};

caption和doctor的類型就相同,可以設(shè)置caption=doctor

如果設(shè)置的值來(lái)自于另一個(gè)對(duì)象,就可以簡(jiǎn)化初始化器。

vardoctor=new{caption.FirstName,caption.LastName};

這些對(duì)象的類型名未知。編譯器為類型偽造了一個(gè)名稱,但只有編譯器才能使用它。

三.結(jié)構(gòu)(struct)

如果僅需要一個(gè)小的數(shù)據(jù)結(jié)構(gòu),此時(shí)類提供的功能多余我們需要的功能,由于性能原因,最好使用結(jié)構(gòu)。

結(jié)構(gòu)是值類型,它們存儲(chǔ)在棧中或存儲(chǔ)為內(nèi)聯(lián)(inline)(如果它們是存儲(chǔ)在堆中的另一個(gè)對(duì)象的一部分),其生存期的限制與簡(jiǎn)單的數(shù)據(jù)類型一樣。

*結(jié)構(gòu)不支持繼承。*對(duì)于結(jié)構(gòu),構(gòu)造函數(shù)的方式與類有一些區(qū)別。編譯器總是提供一個(gè)無(wú)參數(shù)的默認(rèn)構(gòu)造函數(shù),它是不允許替換的。*使用結(jié)構(gòu)可以指定字段如何在內(nèi)存中布局(后面詳細(xì)介紹)

結(jié)構(gòu)實(shí)際上是把數(shù)據(jù)項(xiàng)組合在一起,有時(shí)大多數(shù)字段都聲明為public。嚴(yán)格來(lái)說(shuō),這與編寫.net代碼的規(guī)則相反(字段應(yīng)總是私有的(除const字段外),并由公有屬性封裝)。但是,對(duì)于簡(jiǎn)單的結(jié)構(gòu),公有字段是可以接受的編程方式。

四.類和結(jié)構(gòu)的區(qū)別

1.結(jié)構(gòu)是值類型

雖然結(jié)構(gòu)是值類型,但在語(yǔ)法上可以把它當(dāng)作類來(lái)處理。

structPhoneCusStruct

publicconststringDaySend="Mon";

publicintCusId=0;

PhoneCusStructphoneCusStruct=newPhoneCusStruct();

phoneCusStruct.CusId=3;

因?yàn)榻Y(jié)構(gòu)是值類型,所以new運(yùn)算符與類和其它引用類型的工作方式不同。new運(yùn)算符并不分配堆中的內(nèi)存,而只是調(diào)用相應(yīng)的構(gòu)造函數(shù),根據(jù)傳送給它的參數(shù),初始化所有的字段。

對(duì)于結(jié)構(gòu)編寫下面的代碼是合法的:

PhoneCusStructphoneCusStruct;

phoneCusStruct.CusId=3;

結(jié)構(gòu)遵循其它數(shù)據(jù)類型都遵循的規(guī)則:在使用前所有的元素都必須進(jìn)行初始化。在結(jié)構(gòu)上調(diào)用new運(yùn)算符,或者給所有的字段分別賦值,結(jié)構(gòu)就完全初始化了。

如果結(jié)構(gòu)定義為類的成員字段,在初始化包含的對(duì)象時(shí),該結(jié)構(gòu)會(huì)自動(dòng)初始化為0.

結(jié)構(gòu)是會(huì)影響性能的值類型,但根據(jù)使用結(jié)構(gòu)的方式,這種影響可能是正面的,也可能是負(fù)面的。正面的影響是為結(jié)構(gòu)分配內(nèi)存時(shí),速度很快,因?yàn)樗鼈儗?nèi)聯(lián)或保存在棧中。在結(jié)構(gòu)超出了作用域被刪除時(shí),速度也很快,不需要等待垃圾回收。負(fù)面影響是,只要把結(jié)構(gòu)作為參數(shù)來(lái)傳遞或者把一個(gè)結(jié)構(gòu)賦予另一個(gè)結(jié)構(gòu),結(jié)構(gòu)的內(nèi)容就會(huì)被復(fù)制,而對(duì)于類只復(fù)制引用。這樣就會(huì)有性能損失,根據(jù)結(jié)構(gòu)的大小,性能損失也不同。

注意,結(jié)構(gòu)主要用于小的數(shù)據(jù)結(jié)構(gòu)。當(dāng)把結(jié)構(gòu)作為參數(shù)傳遞給方法時(shí),應(yīng)把它作為ref參數(shù)傳遞,以避免性能損失(這樣只傳遞了結(jié)構(gòu)在內(nèi)存中的地址)。

2.結(jié)構(gòu)和繼承

結(jié)構(gòu)不能從一個(gè)結(jié)構(gòu)中繼承。唯一的例外是對(duì)應(yīng)的結(jié)構(gòu)(和其它類型一樣)最終派生于類System.Object。因此結(jié)構(gòu)也可以訪問(wèn)Object的方法。

在結(jié)構(gòu)中也可以重寫Object中的方法如ToString()方法。

結(jié)構(gòu)的繼承鏈?zhǔn)牵好總€(gè)結(jié)構(gòu)派生于System.ValueType類,System.ValueType類有派生于System.Object。ValueType并沒有給Object添加任何成員,但提供了一些更適合結(jié)構(gòu)的實(shí)現(xiàn)方法。

注意,不能為結(jié)構(gòu)提供其它基類。

3.結(jié)構(gòu)的構(gòu)造函數(shù)

為結(jié)構(gòu)定義構(gòu)造函數(shù)的方式與類的方式相同,但不允許定義無(wú)參數(shù)的構(gòu)造函數(shù)。因?yàn)樵谝恍┖币姷那闆r下,.NET運(yùn)行庫(kù)不能調(diào)用用戶提供的自定義無(wú)參數(shù)構(gòu)造函數(shù),因此Microsoft干脆采用禁止在C#的結(jié)構(gòu)內(nèi)使用無(wú)參數(shù)的構(gòu)造函數(shù)。

默認(rèn)構(gòu)造函數(shù)會(huì)隱式的把字段初始化,即使提供了其它帶參數(shù)的構(gòu)造函數(shù),也會(huì)先調(diào)用它。提供字段的初始值也不能繞過(guò)默認(rèn)構(gòu)造函數(shù)。下面代碼會(huì)編譯錯(cuò)誤:

structPhoneCusStruct

publicintCusId=0;

}

如果PhoneCusStruct聲明為一個(gè)類,就不會(huì)報(bào)錯(cuò)了。

另外,可以像類那樣為結(jié)構(gòu)提供Close()或Dispose()方法。

五.弱引用

在應(yīng)用程序代碼內(nèi)實(shí)例化一個(gè)類或結(jié)構(gòu)時(shí),只要有代碼引用這個(gè)對(duì)象,就會(huì)形成強(qiáng)引用。這意味著垃圾回收器不會(huì)清理這個(gè)對(duì)象使用的內(nèi)存,一般而言這是好事,因?yàn)榭赡苄枰眠@個(gè)對(duì)象,但是如果這個(gè)對(duì)象很大,而且不經(jīng)常訪問(wèn)。這個(gè)時(shí)候可以創(chuàng)建對(duì)象的弱引用。

弱引用允許創(chuàng)建和使用對(duì)象,但在垃圾回收器運(yùn)行時(shí),就會(huì)回收對(duì)象并釋放內(nèi)存。由于存在潛在的Bug和性能問(wèn)題,一般不會(huì)這么做,但在特定情況下使用是合理的。

弱引用使用WeakReference類創(chuàng)建。因?yàn)閷?duì)象可能在任意時(shí)刻被回收,所以引用該對(duì)象前必須確認(rèn)它的存在。

classMainEntryPoint

staticvoidMain()

//InstantiateaweakreferencetoMathTestobject

WeakReferencemathReference=newWeakReference(newMathTest());

MathTestmath;

if(mathReference.IsAlive)

math=mathReference.TargetasMathTest;

math.Value=30;

Console.WriteLine(

"Valuefieldofmathvariablecontains"+math.Value);

Console.WriteLine("Squareof30is"+math.GetSquare());

else

Console.WriteLine("Referenceisnotavailable.");

GC.Collect();

if(mathReference.IsAlive)

math=mathReference.TargetasMathTest;

else

Console.WriteLine("Referenceisnotavailable.");

//DefineaclassnamedMathTestonwhichwewillcallamethod

classMathTest

publicintValue;

publicintGetSquare()

returnValue*Value;

publicstaticintGetSquareOf(intx)

returnx*x;

publicstaticdoubleGetPi()

return3.14159;

}

六.部分類

partial關(guān)鍵字允許把類,結(jié)構(gòu),接口放在多個(gè)文件中。

partial關(guān)鍵字的用法:把partial放在class,struct,interface前面即可。

如果聲明類時(shí)使用了下面的關(guān)鍵字,這些關(guān)鍵字就必須應(yīng)用于同一個(gè)類的所有部分:

public,private,protected,internal,abstract,sealed,new,一般約束

在把部分類編譯后,類的成員和繼承等會(huì)合并。

七.靜態(tài)類

如果類只包含靜態(tài)的方法和屬性,該類就是靜態(tài)的。靜態(tài)類在功能上與使用私有靜態(tài)構(gòu)造函數(shù)創(chuàng)建的類相同。都不能創(chuàng)建靜態(tài)類的實(shí)例。

使用static關(guān)鍵字,編譯器可以檢查用戶是否給該類添加了實(shí)例成員。如果是,就會(huì)生成一個(gè)編譯錯(cuò)誤。這可以確保不創(chuàng)建靜態(tài)類的實(shí)例。

staticclassPhoneCusStruct

publicstaticvoidGetPhene()

}

調(diào)用:PhoneCusStruct.GetPhene();

八.Object類

前面提到,所有的.NET類都派生自System.Object類.實(shí)際上,如果在定義類的時(shí)候沒有指定基類,編譯器就會(huì)自動(dòng)假定這個(gè)類派生自O(shè)bject類。其實(shí)際意義在于,除了自己定義的方法和屬性等外,還可以訪問(wèn)Object定義的許多公有的和受保護(hù)的成員方法。這些方法可用于自己定義的其它類中。

System.Object的方法:

1.GetHashCode():如果對(duì)象放在名為映射(散列表或字典)的數(shù)據(jù)結(jié)構(gòu)中,就可以使用這個(gè)方法。處理這些結(jié)構(gòu)的類使用該方法可以確定把對(duì)象放在結(jié)構(gòu)的什么地方。如果希望把類用作字典的一個(gè)鍵,就需要重寫這個(gè)方法。(后面介紹字典時(shí)會(huì)詳細(xì)介紹)2.Equals()和ReferenceEquals()方法:后面會(huì)詳細(xì)介紹。3.Finalize()方法:在引用對(duì)象作為垃圾被回收以清理資源時(shí)調(diào)用它。Object中實(shí)現(xiàn)的Finalize()方法實(shí)際上什么也沒有做,因而被垃圾回收器忽略。如果對(duì)象擁有對(duì)未托管資源的引用,則在該對(duì)象被刪除時(shí),就需要?jiǎng)h除這些引用,此時(shí)一般要重寫Finalize()方

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論