通用型別系統

通用型別系統

通用類型系統定義了運行期引擎如果使用程式中的數據類型,以及如何配置數據在存儲器中的一種標準,依照此種標準所撰寫的程式語言,都可以在同一個運行期引擎中使用,因此它是跨語言支持的重要部分,亦即匹配 CTS 規範的程式語言所撰寫出的程式,都可以在 CLR 中使用。

基本介紹

  • 中文名:通用類型系統
  • 外文名:Common Type System
  • 縮寫:CTS
簡介,CTS 的功能,CTS 的類型,Boxing 與 Unboxing,Boxing,Unboxing,

簡介

CTS與CLI規格都是由微軟所發展,已標準化為 ECMA 335 標準:“Common Language Infrastructure (CLI) Partitions I to VI.”,並且由 Microsoft 在 .NET Framework 中完全的實作。
CLR中的一切都圍繞類型展開,因為IL是面向對象的高級機器語言.類型向應用程式和其他類型公開了功能.通過類型,用一種程式語言寫的代碼能與另一種程式語言寫的代碼溝通.由於類型是CLR的根本,所以MS制定了一個正式的規範來描述類型的定義和行為,這就是"通用類型系統"。
通用類型(CTS)規範
CTS規範規定,一個類型可以包含零個或者多個成員.成員如下:
(1)、欄位
作為對象狀態一部分的數據變數.欄位根據名稱和類型來區分
(2)、方法
針對對象執行操作的函式,通常會改變對象狀態,方法有一個名稱、一個簽名以及一個或多個修飾符。簽名指定參數數量(及其順序).參數類型:方法是否有返回值,如果有返回值,還要指定返回值類型.
(3)、屬性
對於調用者,屬性看起來像是欄位.但對於類型的實現者,屬性看起來像是一個方法(或者兩個方法,get和set方法).屬性允許在訪問值之前校驗輸入參數和對象狀態,以及/或者盡在必要時才計算某個值.屬性還允許類型的用戶採用簡化的語法.最後,屬性只允許創建唯讀或只寫的"欄位".
(4)、事件
時間在對象以及其他相關對象之間實現了通知機制。具體請參考C# 事件
3、成員修飾符
通用類型系統(CTS)指定了類型可見性規則以及類型成員的訪問規則.如下:
(1)、public
如果將類型標記為public,那么任何程式集都能看見並訪問該類型
(2)、assembly(在C#中使用internal修飾符)
只有在同一個程式集中的代碼才能看見並訪問該類型.
(3)、private
被private修飾的成員智慧型由同一個類型中的其他成員訪問
(4)、family(在C#中使用protected修飾符)
成員可由派生類型訪問,不管那些類型是否在同一程式集中
(5)、protected internal
成員只能由同一程式集中的任何類型來訪問.

CTS 的功能

  1. 創建一個可協助跨語言集成、類型安全與代碼的高性能運行的框架規範。
  2. 提供可在許多程式語言中完全實現的面向對象模型。
  3. 定義程式語言必須遵行,以幫助在不同的程式語言中所實現的對象能夠與其他程式語言互動的規則。
  4. CTS 也定義了確保由不同程式語言所定義的數據類型能與其他程式語言互動的規則。

CTS 的類型

CTS 定義了兩種類型:
實值類型 (Value-type)
  • 實值類型直接包含數據,而且實值類型的運行個體 (Instance) 不是在堆疊上配置,就是在結構中內嵌 (Inline) 配置。實值類型可為內置 (由運行階段實現)、用戶定義或枚舉類型 (Enumeration)。
引用類型 (Reference-type)
  • 存儲變數存儲器地址的引用,並且在堆積 (Heap) 上配置。引用類型可為自我描述類型、指針類型 (Pointer Type) 或接口類型 (Interface Type)。引用類型的類型可從自我描述類型的值判斷出來。自我描述類型可再分為數組和類別類型。類別類型包括用戶定義類型、Boxed 實值類型和委派。

Boxing 與 Unboxing

Boxing

所謂的打包 (Boxing),是指將實值類型轉換成引用類型的一種機制,如下列代碼所示,程式並不一定要明確的告知編譯器要將實值類型轉換成引用,它自己會處理這個部分。
Int32 x = 10; object o = x ; // 隱含打包Console.WriteLine("The Object o = {0}",o); // prints out 10
然而,一個 Int32 變數總能夠使用類似下列的方式來外顯打包:
Int32 x = 10; object o = (object) x; // 外顯打包(明確指定)Console.WriteLine("The object o = {0}",o); // prints out 10

Unboxing

所謂的解包 (Unboxing),是指將引用類型反轉回實值類型,如下列程式所示。
Int32 x = 5; object o = x; // 隱含打包x = o; // 隱含解包

相關詞條

熱門詞條

聯絡我們