NET CLR via C#(第4版)第4章 類型基礎

來源:互聯網
上載者:User

標籤:大小   變數   基礎   ace   尋找   2-2   類構造   height   employee   

本章內容:1 所有類型都從System.Object派生2 類型轉換3 命名空間和程式集4 運行時的相互關係 本章講述使用類型和CLR時需掌握的基礎知識。具體地說,要討論所有類型都具有的一組基本行為。討論型別安全、命名空間、程式集、以及如何將對象從一種類型轉換成另一種類型。本章最後會解釋類型、對象、線程棧和託管堆在運行時的相互關係。 4.1 所有類型都從System.Object派生CLR要求每個類型最終都從System.Object類型派生。從而確保類每個對象都具備一組最基本的方法。[公開方法]EqualsGetHashCodeToStringGetType[受保護方法]MemberwiseCloneFinalize CLR要求所有對象都用new操作符建立。以下new操作符所做的事情:1 計算類型及其所有基底類型(一直到System.Object,雖然它沒有定義自己的執行個體欄位)中定義的所有執行個體欄位需要的位元組數。堆上每個對象都需要一些額外的成員,包括“類型對象指標”和“同步塊索引”。CLR利用這些成員管理對象。額外成員的位元組數要計入對象大小。2 從託管堆中配置類型要求的位元組數,從而指派至的記憶體,分配的所有位元組都設為0。3 初始化對象的“類型對象指標”和“同步塊索引”成員。4 調用類型的執行個體構造器,傳遞在new調用中指定的實參。大多數編譯器都在構造器中自動產生代碼來調用基類構造器。每個類型的構造器都負責初始化該類型定義的執行個體欄位。最終調用System.Object的構造器,該構造器什麼都不做,簡單地返回。 new執行了所有這些操作之後,返回指向建立對象的一個引用(或指標)。並且沒有和new操作符對應的delete操作符;換言之,沒有辦法顯式釋放為對象分配的記憶體。CLR採用了記憶體回收機制,自動檢測一個對象不再被使用或是訪問,並自動釋放該對象的記憶體。 4.2 類型轉換CLR最重要的特性之一就是型別安全。在運行時,CLR總是知道對象的類型是什麼。調用GetType方法即可。 CLR允許將對象轉換為它的(實際)類型或者它的任何基底類型。C#不要求任何特殊文法即可講對象轉換為它的任何基底類型,因為向基底類型的轉換被認為是一種安全的隱式轉換;然而,將對象轉換為它的某個衍生類別型時,C#要求開發人員只能進行顯式轉換,因為這種轉換可能在運行時失敗。 使用C#的is和as操作符來轉型is檢查對象是否相容於指定類型,返回Boolean值,is操作符永遠不拋出異常;CLR的類型檢查增強了安全性,但無疑會對效能造成一定影響。這是因為CLR首先必須判斷變數引用的對象的實際類型,然後,CLR必須遍曆繼承階層,用每個基底類型去核對指定的類型。由於這是一個相當常用的編程模式,所以C#專門提供了as操作符,目的是簡化這種代碼的寫法,同時提升效能。CLR核實一個對象是否相容與一種類型,如果是,as返回同一個對象的非null引用,如果不相容,as返回null。注意:as操作符只校正一次物件類型。 C#允許類型定義轉換操作符方法,詳情參見8.5節 “轉換操作符方法”。 4.3 命名空間和程式集命名空間 對相關的類型進行邏輯分組,開發人員可以通過命名空間方便定位類型。 對於編譯器,命名空間的作用就是為類型名稱附件以句號分割的符號,使名稱變得更長,更可能具有唯一性。 CLR對“命名空間”一無所知。C# using指令的另一種形式允許為類型或命名空間建立別名。 命名空間和程式集的關係注意,命名空間和程式集(實作類別型的檔案)不一定相關。特別是,同一個名空間中的類型可能在不同程式集中實現,同一個程式集也可能包含不同命名空間中的類型。在文檔中尋找類型時,文檔會明確指出類型所屬的命名空間,以及實現了該類型的程式集。 4.4 運行時的相互關係本節將解釋類型、對象、線程棧和託管堆在運行時的相互關係。此外,還將解釋調用靜態方法、執行個體方法和虛方法的區別。 “序幕”(prologue)代碼:在方法開始做工作前對其進行初始化;“尾聲”(epilogue)代碼:在方法做完工作後對其進行清理,以便返回至調用者。 堆上所有對象都包含兩個額外成員:類型對象指標 和 同步塊索引。 對象含有一個指標指向對象的類型對象(類型對象中包含靜態欄位表和方法表)。 CLR建立類型對象時,必須初始化這些成員。CLR開始在一個進程中運行時,會立即為MSCorLib.dll中定義的System.Type類型建立一個特殊的類型對象。Employee和Manager類型對象都是該類型的“執行個體”。因此,它們的類型對象指標成員會初始化成對System.Type類型對象的引用。當然,System.Type類型對象本身也是對象,內部也有“類型對象指標”成員。這個指標指向它本身,因為System.Type類型對象本身是一個類型對象的“執行個體”。這就是CLR的整個類型系統及其工作方式。也就是說,GetType方法返回指向對象的類型對象的指標,這樣就可以判斷系統中的任何對象的真實類型了。    

NET CLR via C#(第4版)第4章 類型基礎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.