[C++/CLI編程寶典][7]基本概念

來源:互聯網
上載者:User

本次講解一些基本的概念,中英文的對照:

1) Dynamic Link Library動態連結程式庫/Assembly程式集 : Dynamic Link Library動態連結程式庫,我們在ISOC++中知道,尾碼為.DLL的檔案為動態連結程式庫,動態連結程式庫實現了代碼的組建級重用,但是當在CLI擴充後,與之對應的託管組建,我們稱為Assembly程式集。程式集是 .NET Framework 應用程式的構造塊;程式集構成了部署、版本控制、重複使用、啟用範圍控制和安全許可權的基本單元。程式集是為協同工作而產生的類型和資源的集合,這些類型和資源構成了一個邏輯功能單元。程式集向公用語言運行庫提供瞭解類型實現所需要的資訊。對於運行庫,類型不存在於程式集上下文之外。

程式集由組件中繼資料、類型中繼資料、中繼語言代碼和資源構成。如:

程式集分為私用組件和共用組件。私用組件是應用程式級使用,共用組件為整個系統公用。

2)IL中繼語言 :IL = Intermediate Language中繼語言,IL中繼語言是CLI的基礎,所有.NET原始碼(不管用哪種語言編寫)都被編譯成IL。當軟體被安裝時,IL轉換為機器碼,或在運行時被即時(Just-In-Time,JIT)編譯器所處理。當然C++/CLI是對.NET的擴充,所以理所當然C++/CLI被編譯為IL代碼。

3)棧/本地堆/託管堆 :其實堆棧的概念,我們在ISOC++就有,棧也就是以前我們所說的堆棧,是由編譯器自動分配釋放,用來存放函數參數值,函數的返回地址,非靜態局部變數的值等。其操作方式類似於資料結構中的棧(後進先出LIFO)。堆一般由程式員分配釋放,若程式員不釋放,程式結束可能由OS回收。當C++/CLI對CLI擴充後,由於.NET的通用語言運行時提供了記憶體回收行程對堆進行自動管理,所以這個時候,以前在ISOC++的堆,這個時候就不得不被分成本地堆和託管堆,本地堆即以前的ISOC++中分配的記憶體,這些記憶體由程式員自己分配和釋放,還有一種是程式員分配但是是由.NET的垃圾收集器來管理,這時的堆我們稱為託管堆。

4)本地類型/本地代碼 :本地類型即以前ISOC++中的類型,此類型被分配在棧和本地堆上。使用本地類型的代碼我們稱為本地代碼。

5)託管類型/Managed 程式碼 :在C++/CLI中,相對於ISOC++引入了託管類型,託管類型實現的代碼為Managed 程式碼。

6)Value實值型別/Ref參考型別 :託管類型又被分為value實值型別和Ref參考型別。實值型別被分配在棧上,參考型別被分配在託管堆上,託管堆由.NET的垃圾收集器自動管理。

7)引用/指標/handle追蹤控制代碼 : 在ISOC++中,我們知道引用和指標的概念,比如定義int i = 10; 引用定義int & ir = i; 和指標定義int*pI = &i; 在C++/CLI中的託管類型我們也可以自己為其分配記憶體,比如 system::String^ str = gcnew System::String("Hello");但是這時的記憶體由.NET的垃圾收集器來管理,這樣的由垃圾收集器管理的由gcnew建立的對象我們稱為Handle追蹤控制代碼。

8)property屬性 :在託管類型中我們可以使用property屬性,來對Field欄位(成員變數)進行封裝,就像是以前變數的getX()和setX()方法。

9)delegate委託 :在託管世界中,引入了一種新的類型delegate委託,delegate其實也就是我們以前ISOC++的函數指標的定義,用來實現CALLBACK機制。

10)events事件 : 在託管類型中可以定義event成員,event其實就是delegate的一個執行個體。

11)gcnew(建構函式)/delete(~解構函式)/Finalizer(!終結函數) :程式員要想建立託管對象在託管堆上就的使用gcnew,由gcnew建立的對象我們稱為handle追蹤控制代碼,調用gcnew的過程其實包含了分配記憶體和建構函式的調用。當handle是有結束後,我們可以調用delete來調用解構函式同時表明該對象不再被使用以使下一輪的記憶體回收可以回收該對象,但是如果我們沒有調用解構函式也沒有關係,當.NET檢測到該對象不再使用時就會調用終結函數同時開始著手回收該對象。

12)attribute特性 :Attribute 類將預定義的系統資訊或使用者定義的自訂資訊與目標元素相關聯。目標元素可以是程式集、類、建構函式、委託、枚舉、事件、欄位、介面、方法、可攜式執行檔模組、參數、屬性 (Property)、傳回值、結構或其他屬性 (Attribute)。屬性所提供的資訊也稱為中繼資料。中繼資料可由應用程式在運行時進行檢查以控製程序處理資料的方式,也可以由外部工具在運行前檢查以控制應用程式處理或維護自身的方式。例如,.NET Framework 預定義屬性類型並使用屬性類型控制運行時行為,某些程式設計語言使用屬性類型表示 .NET Framework 公用類型系統不直接支援的語言功能。

13)reflection反射 :由於C++/CLI的底層為IL,這就導致了C++/CLI編譯所產生DLL和EXE具有很強自描述能力,通過放射,在沒有原始碼的情況任然可以在運行時獲得.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.