[你必須知道的.NET] 第七回:品味類型---從通用類型系統開始
[2] [你必須知道的.NET] 第七回:品味類型---從通用類型系統開始
系列文章導航:
[你必須知道的.NET] 第四回:后來居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透
[你必須知道的.NET] 第六回:深入淺出關鍵字---base和this
[你必須知道的.NET] 第七回:品味類型---從通用類型系統開始
[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理
[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規則無邊
[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應用征途
[你必須知道的.NET] 第十一回:參數之惑---傳遞的藝術(上)
[你必須知道的.NET] 第十二回:參數之惑---傳遞的藝術(下)
[你必須知道的.NET] 第十三回:從Hello, world開始認識IL
[你必須知道的.NET] 第十四回:認識IL代碼---從開始到現在
[你必須知道的.NET] 第十六回:深入淺出關鍵字---using全接觸
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
本文將介紹以下內容:
• .NET 基礎架構概念
• 類型基礎
• 通用類型系統
• CLI、CTS、CLS的關系簡述
1. 引言
本文不是連環畫,之所以在開篇以圖形的形式來展示本文主題,其實就是想更加特別的強調這幾個概念的重要性和關注度,同時希望從剖析其關系和聯系的角度來講述.NET Framework背后的故事。因為,在作者看來想要深入的了解.NET,必須首先從了解類型開始,因為CLR技術就是基于類型而展開的。而了解類型則有必要把焦點放在.NET類型體系的公共基礎架構上,這就是:通用類型系統(Common Type System, CTS)。
我之所以將最基本的內容以獨立的章節來大加筆墨,除了為后面幾篇關于對類型這一話題深入討論做以鋪墊之外,更重要的是從論壇上、博客間,我發現有很多同行對.NET Framework基礎架構的幾個重要體系的理解有所偏差,因此很有必要補上這一課,必備我們在深入探索知識的過程中,能夠游刃有余。
2. 基本概念
還是老套路,首先引入MSDN對通用類型系統的定義,通用類型系統定義了如何在運行庫中聲明、使用和管理類型,同時也是運行庫支持跨語言集成的一個重要組成部分。通用類型系統執行以下功能:
• 建立一個支持跨語言集成、類型安全和高性能代碼執行的框架。
• 提供一個支持完整實現多種編程語言的面向對象的模型。
• 定義各語言必須遵守的規則,有助于確保用不同語言編寫的對象能夠交互作用。
那么我們如何來理解呢?
還是一個現實的場景來引入討論吧。小王以前是個VB迷,寫了一堆的VB.NET代碼,現在他變心了,就投靠C#的陣營,因為流行嘛。所以當然就想在當前的基于C#開發的項目中,應用原來VB.NET現成的東西,省點事兒:-)。那么CLR是如何來實現類型的轉換的,例如Dim i as Single變量i,編譯器會自動的實現將i由Single到float的映射,當然其原因是所有的.NET編譯器都是基于CLS實現的。具體的過程為:CTS定義了在MSIL中使用的預定義數據類型,.NET語言最終都要編譯為IL代碼,也就是所有的類型最終都要基于這些預定義的類型,例如應用ILDasm.exe分析可知,VB.NET中Single類型映射為IL類型就是float32,而C#中float類型也映射為float32,由此就可以建立起VB.NET和C#的類型關系,為互操作打下基礎。
Code
過去,由于各個語言在類型定義方面的不一致,造成跨語言編程實現的難度,基于這一問題,.NET中引入CTS來解決各個編程語言類型不一致的問題,類型機制使得多語言的代碼可以無縫集成。因此CTS也成為.NET跨語言編程的基礎規范,為多語言的互操作提供了便捷之道。可以簡單的說,基于.NET的語言共同使用一個類型系統,這就是CTS。
進一步的探討通用類型系統的內容,我們知道CTS支持兩種基本的類型,每種類型又可以細分出其下級子類,可以以下圖來表示:
.NET提供了豐富的類型層次結構,從上圖中也可以看出該層次結構是基于單繼承層次實現的,反映了.NET面向對象原則中實現單繼承、接口多繼承的特點。關于值類型和引用類型,是之后要探討的重點內容,也是『品味類型』子系列的重中之重,在此不作進一步探討,但是上面的這張圖有必要清楚的印在心中,因為沒有什么比這個更基礎的了。