.NET本質論

來源:互聯網
上載者:User

標籤:win   line   this   void   跳轉   walk   member   包含   read   

Technorati 標籤: .NET,C#

1. CLR是一個更好的COM。從COM開發人員所面臨的問題入手,講述了CLR如何應用虛擬化以及無所不在的、可擴充的中繼資料,解決這些COM問題,從而最終取代COM。

2. 組件。從根本上講,CLR是OS和COM載入器的替代品,本章討論了代碼是如何封裝和載入的,它們與Win32和COM世界中的情形大相徑庭。

3. 類型基礎。組件是代碼和構成f類型定義的中繼資料的容器。本章重點討論了一般型別系統(Common Type System, CTS),包括類型的組成部分,以及類型是如何關聯的。

完整類型包括3個部分:程式集名字、可選的命名空間首碼和類型名稱。類型可以包括3類成員:欄位、方法和巢狀型別。

類型的欄位控制記憶體如何分配,CLR在第一次使用類型的時候初始化static欄位的值,在建立對象的時候會初始化執行個體欄位的值。const欄位和readonly,const=static readonly。

方法。靜態方法和執行個體方法,方法重載。

巢狀型別。CLR將巢狀型別當做宣告類型的靜態成員,它不隸屬於任何特定執行個體。巢狀型別的名字由外部類型名字限定,由於巢狀型別是外部類型的一部分,它能夠訪問外部類型的private欄位。反之,外部類型並不能訪問巢狀型別的private欄位。

類型和初始化。類型初始化器,也就是static建構函式,每個類型只能有一個,沒有參數,也沒有傳回值。靜態欄位聲明在靜態建構函式前面執行。

類型和介面。

類型和基底類型。成員重載overloading和隱藏shadowing。

建構函式的執行順序。C#和C++的處理策略不一樣。

派生和構造,c#。

4. 用類型編程。在編程模型中,CLR將類型作為第一類概念。本章討論了CLR程式中類型的顯式用法,主要是中繼資料與運行時類型資訊的角色。

a.運行時的類型。類型的執行個體分為值和對象,每個對象有一個“對象頭”:一個同步塊索引欄位和一個指向物件類型的控制代碼。

對象頭和類型控制代碼

每個類型都有一張介面表,包含了類型相容的介面的入口項,對介面類型的轉換通過這張表匹配;為了支援向直接或間接基底類型的轉換,類型結構還有一個指向基底類型的指標。

類型的階層和運行時的類型資訊

類型資訊的資料結構可以通過Type訪問,比如判斷繼承關係,可以用Type對象的IsSubClassOf或IsAssignableFrom,IsValueType判斷是否實值型別等等。

中繼資料編程。一般中繼資料編程是用來產生代碼,這裡只討論讀取中繼資料。

反射物件模型。其中Type.GetMembers可以獲得類型中的全部的成員:欄位、方法和巢狀型別

反射類型的階層

Type.GetMembers預設返回Type的公有約定中的部分成員,同時不包括靜態成員,要想得到其他的成員,可以通過BindingFlags枚舉指定。

using System;
using System.Reflection;
public sealed class Util
{
    public static void DumpMembers(Type type)
    {
        // get the type‘s members
        BindingFlags f = BindingFlags.Static
        | BindingFlags.Instance
        | BindingFlags.Public
        | BindingFlags.NonPublic
        | BindingFlags.FlattenHierarchy;
        MemberInfo[] members = type.GetMembers(f);
        // walk the list of members
        for (int i = 0; i < members.Length; i++)
            Console.WriteLine("{0} {1} ",
            members[i].MemberType,
            members[i].Name);
    }
}

使用反射的一個例子

5. 執行個體。CLR編程模型是基於類型、對象和值的。第四章討論類型,本章則重點討論對象和值。特別是概述了這兩種執行個體模型的差別,包括值與對象在記憶體管理方面的不同。

6. 方法。所有組件之間的互動都是在方法調用中體現出來的。CLR提供了一系列技術,使得方法調用成為清晰的行為。本章將介紹這些技術,從Just-In-Time 編譯時的方法初始化開始,直到類型異常時的方法終止。

方法和JIT編譯。每個類型都有一張方法表,下面的例子是方法f調用情況。

class Bob {
    static int x;
    static void a() { x += 2; }
    static void b() { x += 3; }
    static void c() { x += 4; }
    static void f()
    { c(); b(); a(); }
}

方法f對應的機器碼native code。

方法表的每個入口項指向一個唯一的存根常式(sub routine),初始化時,每個存根常式包含對CLR的JIT編譯器的調用(PreStubWorker),在JIT編譯器產生機器碼後,它會重寫存根常式,插入一個jmp指令跳轉到剛才產生的程式碼。

是的JIT編譯和方法表,是JIT剛好編譯f和c後的快照。

顯示了JIT編譯前後的方法存根

方法調用和類型。方法調用的CIL是call,虛方法調用對應的是callvirt。CIL的call指令靜態地綁定本機IA-32指令到特定類型的方法表,callvirt產生一個特別的指令,它將根據目標對象的類型決定使用哪張表。每個類型的方法表中第一個地區是虛方法,包含基類的虛方法(最前面的是object的4個虛方法),第二個地區是非虛方法。

虛方法調用對應的native代碼。第一句將this指標放到ecx中,第二句將類型控制代碼放到eax中,第三句根據方法表的位移量調用方法。這個位移量是類型載入時算出來的,不同的載入可能不一樣,但是在一次載入中是不變的。

move ecx, esi
move eax, dword ptr [ecx]
call dword ptr [eax + 38h]

newslot和虛方法。每個虛方法在方法表中有一個插槽slot,如果虛方法聲明為newslot,那麼會分配一個新的插槽,這個插槽在所有基底類型虛方法的後面;如果沒有聲明為newslot,那麼會替換基底類型中的相同簽名的方法。

介面、虛方法和抽象方法。每個CLR類型都有一個方法表,CLR是這樣安排這個方法表的:對於一個特定的聲明介面,它的所有方法表插槽都是連續的。但是對於不同的類型,介面的方法表絕對位置可能不同,CLR使用介面位移量表(interface offset table)來指名位置。

圖6.4 使用基於介面引用的虛函數

C#支援兩種實現介面方法的技術:一種是作為帶有相同簽名的公有方法,一種是實現相同簽名的私人方法,方法名必須遵循InterfaceName.MethodNam的約定。例如對於介面IDrawable的Display方法,其實現的方法名為Idrawable.Display。前一種實現方法成為類公有簽名的一部分,後者只能通過up-cast成介面才能訪問。注意第二個Clone如果聲明為public編譯會報錯(修飾符“public”對該項無效)。

CLR認為介面的方法是virtual的,也就是方法放在介面表的virtual部分,類繼承介面如果沒有顯式聲明virtual,CLR會當做virtual sealed處理(c#不能將同時使用virtual和sealed),也就是其衍生類別不能再override。下面是繼承介面的例子。

判斷下面例子中幾個DoIt調用的方法。

第一個調用方法e,第二個調用e,第三個調用b,第四個調用c。想象下ReallyDerived方法表

顯式方法調用。

7. 進階方法。CLR提供了強大的架構用來偵聽方法調用。本章剖析了CLR偵聽的實用組件,以及它對面向方面編程(aspect-oriented programming)的支援。

8. 域。CLR採用了AppDomain而不是OS進程,來劃分代碼的執行範圍。本章從兩個方面討論AppDomain的角色,即作為底層OS進程的替代品,以及一個AppDomain與程式集解析器或載入器之間的互動。

9. 安全性。CLR一個主要的優點就是提供安全啟動並執行環境,本章闡述了CLR載入器如何支援想代碼授予特權,以及這些特權如何被強制實施的。

10. CLR外部環境。前9章都是討論基於CLR編程模型的程式設計,最後一章則關注該編程模型對外的方式,以及它如何處理外部世界。

.NET本質論

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.