C# 類(lèi)內(nèi)部的組成原理簡(jiǎn)要剖析_第1頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、c# 類(lèi)內(nèi)部的組成原理簡(jiǎn)要剖析昨天考試中碰到一道這樣的題目,也許是如下形式: 下列關(guān)于c說(shuō)法錯(cuò)誤的是:(挑選兩項(xiàng)) a 類(lèi)可以實(shí)例化為對(duì)象 b對(duì)象可以實(shí)例化為類(lèi) 類(lèi)可以調(diào)用非靜態(tài)成員 對(duì)象可以調(diào)用靜態(tài)成員 一 掃下來(lái),我發(fā)覺(jué)三個(gè)挑選都是錯(cuò)誤的,挑選錯(cuò)的很顯然,而選項(xiàng)的錯(cuò)誤在于靜態(tài)成員只能由類(lèi)型對(duì)象來(lái)調(diào)用,而實(shí)例對(duì)象是不能調(diào)用靜態(tài)成員的?;氐綄嬍遥矣鷣?lái)感覺(jué)問(wèn)題 乎不像我想象的那么容易,我發(fā)覺(jué)從理論上說(shuō)實(shí)例對(duì)象也應(yīng)當(dāng)是可以調(diào)用靜態(tài)成員的,起碼有途徑可以辦到,為了將這個(gè)問(wèn)題闡述的越發(fā)清晰,讓我們來(lái)分析一下托管堆中創(chuàng)建對(duì)象和對(duì)象運(yùn)行時(shí)在內(nèi)存的一些狀況。 首先對(duì)于托管應(yīng)用程序來(lái)說(shuō),內(nèi)存中最為重要的布局

2、有兩個(gè)地方,一個(gè)是線程堆棧,也就是應(yīng)用程序調(diào)用辦法,保存變量,指針的內(nèi)存區(qū)域,另一個(gè)便是托管堆,堆中的內(nèi)存經(jīng)常被用來(lái)創(chuàng)建引用類(lèi)型的對(duì)象,而 類(lèi)型的對(duì)象普通在線程堆棧上創(chuàng)建。托管堆受clr和垃圾收集器的控制,保證其無(wú)用對(duì)象被恰時(shí)釋放和內(nèi)存的正確分發(fā)。應(yīng)用程序中創(chuàng)建的對(duì)象引用的類(lèi)型作為指針保存在線程堆棧上,而對(duì)象的實(shí)際類(lèi)型則在托管堆上保存。設(shè)想如下代碼: class a class b:a class c private ic vo main() a a=new b(): /此處的a引用在堆棧上保存,而new出的實(shí)例b在托管堆上保存。 為了便利和徹低的研究,我們假設(shè)此時(shí)內(nèi)存上尚未創(chuàng)建任何對(duì)象,此時(shí)

3、clr正欲編譯執(zhí)行如下代碼: 1 a=new a(); 2 a b=new b(): 3 b c=new b(); 當(dāng)代碼運(yùn)行到1時(shí),clr首先會(huì)在內(nèi)存托管堆上創(chuàng)建一個(gè)type對(duì)象,因?yàn)槿魏我脤?duì)象都包含除本身的字段和辦法外,還有另外的兩個(gè)數(shù)據(jù)結(jié)構(gòu):類(lèi)型對(duì)象指針和同步索引塊,類(lèi)型對(duì)象指針用來(lái)指向該對(duì)象本身的類(lèi)型,而同步索引塊用來(lái)同步數(shù)據(jù)和保證線程平安,故type對(duì)象也會(huì)初始化這兩個(gè)數(shù)據(jù)結(jié)構(gòu),而它的類(lèi)型對(duì)象指針指向的便是它本身,其后該對(duì)象初始化內(nèi)部全部的靜態(tài)字段,再提領(lǐng)元數(shù)據(jù)得到全部的辦法列表,保存在對(duì)象中,完成這個(gè)操作之后,clr會(huì)發(fā)覺(jué)a,b類(lèi)型的對(duì)象需要在接下來(lái)的操作中被實(shí)例化,于是clr首

4、先會(huì)在托管堆中分配相應(yīng)大小的內(nèi)存來(lái)保存這兩個(gè)類(lèi)型的類(lèi)型對(duì)象,所謂類(lèi)型對(duì)象,就是在未實(shí)例化實(shí)例對(duì)象之前,clr會(huì)先在內(nèi)存中建立需要實(shí)例化的類(lèi)型的模板,而該模板中保存了實(shí)例化該對(duì)象所需的靜態(tài)字段和全部的辦法列表。然后,當(dāng)clr發(fā)覺(jué)接下來(lái)操作的類(lèi)型都已經(jīng)建立了相應(yīng)的類(lèi)型對(duì)象之后,clr就開(kāi)頭舉行實(shí)例化的操作,第1行代碼需要實(shí)例化一個(gè)a類(lèi)型的實(shí)例對(duì)象,對(duì)于new關(guān)鍵字作為對(duì)象實(shí)例化的操作來(lái)說(shuō),內(nèi)存中實(shí)際的操作有: 1 計(jì)算本類(lèi)以及全部層次上的基類(lèi)所定義的全部的實(shí)例字段,與創(chuàng)建類(lèi)型對(duì)象指針和同步索引塊所需要的全部字段之和。以此確定該對(duì)象的大小。 2 從托管堆中分配指定大小的字節(jié)數(shù)來(lái)創(chuàng)建對(duì)象,分配的全部字

5、節(jié)都初始化為0。 3 初始化類(lèi)型對(duì)象指針和同步索引塊 4 遞歸調(diào)用類(lèi)型構(gòu)造器,初始化全部字段為可用狀態(tài)。 clr執(zhí)行完這些操作之后,返回該對(duì)象的首地址指針作為引用保存在堆棧上。 此處的a類(lèi)型對(duì)象的類(lèi)型對(duì)象指針會(huì)被初始化為指向type類(lèi)型對(duì)象。而a類(lèi)型實(shí)例對(duì)象的類(lèi)型對(duì)象指針會(huì)被初始化為指向a類(lèi)型對(duì)象。這樣,無(wú)論引用該實(shí)例對(duì)象的引用是什么類(lèi)型,都可以通過(guò)類(lèi)型對(duì)象指針查找到該類(lèi)型的實(shí)際類(lèi)型,這一點(diǎn)是clr在執(zhí)行類(lèi)型檢查,保證不被引用的虛假類(lèi)型表象所哄騙的肯定保證。 從以上的研究中,可以得到如下事實(shí): 實(shí)例字段保存在實(shí)例對(duì)象中,實(shí)例字段保存在對(duì)象堆中,通過(guò)實(shí)例對(duì)象的引用獲得。故可用 實(shí)例對(duì)象.字段名

6、來(lái)引用實(shí)例字段。 靜態(tài)字段和辦法列表保存在類(lèi)型對(duì)象中,在辦法未編譯之前,辦法表的地址都指向編譯入口,直到應(yīng)用程序調(diào)用該辦法時(shí),通過(guò)編譯器載入該辦法的il代碼,即時(shí)編譯成本地機(jī)器代碼,然后替換其入口地址,此后,該辦法再次被拜訪到時(shí),便可以以本地代碼運(yùn)行速度全速運(yùn)行。而實(shí)際的辦法體代碼保存在線程堆棧中(假如該辦法代碼已經(jīng)編譯的話)。 下面將要研究非虛實(shí)例辦法,虛實(shí)例辦法,靜態(tài)辦法的調(diào)用狀況。 當(dāng)一個(gè)非虛實(shí)例辦法被調(diào)用時(shí),clr在線程堆棧中查找該引用獲得其定義的類(lèi)型(并不一定是該引用指向?qū)ο蟮膶?shí)際類(lèi)型),然后挺直轉(zhuǎn)到該引用定義的對(duì)象的類(lèi)型對(duì)象中去查找辦法列表,得到該辦法在堆棧中的辦法體,再跳轉(zhuǎn)到首地

7、址執(zhí)行,假如在該類(lèi)型對(duì)象中未查詢(xún)到該辦法,解釋調(diào)用辦法繼承自父類(lèi),于是clr會(huì)回溯類(lèi)層次結(jié)構(gòu),直到查找到該類(lèi)型辦法為止。實(shí)際上非虛實(shí)例辦法的調(diào)用是不需要實(shí)例對(duì)象真切存在的,換句話說(shuō),即使對(duì)象為null,理論上clr也能正常的調(diào)用到定義的非虛實(shí)例辦法,由于clr根本不會(huì)理睬該引用指向的實(shí)例對(duì)象,而是挺直查詢(xún)到該類(lèi)的類(lèi)型對(duì)象,而類(lèi)型對(duì)象是一定會(huì)創(chuàng)建在內(nèi)存中的,但c語(yǔ)法強(qiáng)制規(guī)定必需為引用創(chuàng)建實(shí)例對(duì)象才干調(diào)用非靜態(tài)辦法,這一點(diǎn)使得無(wú)法為空引用調(diào)用辦法體。 當(dāng)一個(gè)虛實(shí)例辦法被調(diào)用時(shí),clr在實(shí)例對(duì)象中查找其類(lèi)型對(duì)象指針,得到該類(lèi)型本身的類(lèi)型對(duì)象,然后調(diào)用其中定義的辦法,此處說(shuō)明了假如一個(gè)父類(lèi)的引用引用子

8、類(lèi)的實(shí)例,調(diào)用的虛辦法為何為子類(lèi)本身重寫(xiě)的辦法,緣由就在于雖然是父類(lèi)引用,但在調(diào)用虛辦法時(shí),clr會(huì)挺直到實(shí)例對(duì)象中去查詢(xún)?cè)搶?shí)例本身的類(lèi)型對(duì)象,從而會(huì)確定的引用到該實(shí)例本身的類(lèi)型對(duì)象上來(lái)。 當(dāng)一個(gè)靜態(tài)辦法被調(diào)用時(shí),因?yàn)橹荒苡深?lèi)名調(diào)用靜態(tài)辦法,所以其類(lèi)型對(duì)象很簡(jiǎn)單確定,之后得到辦法體在堆棧中的偏移,便可以調(diào)用該類(lèi)型對(duì)象的靜態(tài)辦法。 收拾后得到 好了,當(dāng)以上全部基礎(chǔ)學(xué)問(wèn)研究完畢之后,我們可以來(lái)設(shè)想一下,應(yīng)當(dāng)如何調(diào)用,才可以讓實(shí)例對(duì)象得到靜態(tài)辦法的引用。當(dāng)一個(gè)對(duì)象實(shí)例被創(chuàng)建之后,類(lèi)型對(duì)象指針必定保存了該實(shí)例對(duì)象所屬的類(lèi)型對(duì)象的地址,從而可以挺直指向其類(lèi)型對(duì)象,而一個(gè)類(lèi)型的類(lèi)型對(duì)象中保存的是該類(lèi)型的靜態(tài)字段與全部的辦法列表,包括靜態(tài)辦法和非靜態(tài)辦法。clr此時(shí)便可以通過(guò)入口地址替換的方式,從編譯入口替換到靜態(tài)辦法體入口地址,從而可以讓程序轉(zhuǎn)到該靜態(tài)辦法去執(zhí)行。 所以,我覺(jué)得從技術(shù)上講實(shí)例對(duì)象是可以調(diào)用靜態(tài)成員的。但c語(yǔ)法根本不會(huì)允許這種狀況的發(fā)生。經(jīng)過(guò)思量,我覺(jué)得可能與面對(duì)對(duì)象的編程方式與思想有關(guān)。靜態(tài)成員本質(zhì)上是一個(gè)固定存在的個(gè)體,不應(yīng)當(dāng)屬于任何一個(gè)實(shí)例的個(gè)體,更因?yàn)殪o態(tài)辦法沒(méi)有隱式的this對(duì)象 傳入,從而也

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論