首頁 »
2011/12/09

C# 4.0語言新功能到底在賣什麼葯

這幾天我正撰寫ASP.NET 4.0專家技術手冊,在條列C# 4.0語法新功能時,耗費很多心思在研究該怎麼講這些新的語法功能,因為微軟MSDN Library、C# 4.0英文書籍和MSDN雜誌專欄與Tech ED研討會,大家稍有不同的詮譯法,這令我困惑,該以誰的為基準來詮釋最好。但後來我發現一件有趣的事...

在研究C# 4.0許多新功能抽象意念時,耗費我許多心思與腦力,後來我恍然發現,這些功能原來是在賣弄"型別"這個名堂呀!

C# 4.0新增的語言功能,除了具名與選擇性引數較為通俗常用(VB早已支援),其他功能幾乎是從動態基礎(所謂的Dynamic動態有兩個層面意義,一是Dynamic型別,另一是DLR引擎)衍生出來的便利性或可能性,新功能如下:
•具名引數與選擇性引數(Named and Optional Arguments)
•Dynamic動態型別(Dynamic Type)
•共變數與反變數(Covariance and Contravariance)
•Office可程式性支援(Office Programmability)
•型別對等支援(Type Equivalence Support)


後四者是指一群概念性功能的統稱,而不是單一功能,所以每個題目鑽進去,展開後有很多議題,不是三兩句話可以講完的,有一大包。以下擇要解釋:

•Dynamic動態型別(Dynamic Type)
Dynamic動態型別很容易下指令,例如dynamic d=1,表示它是一個Dynamic型別,但在Runtime執行時,你用GetType()方法取得它的型別,會是"System.Int32"。所以Dynamic是針對型別

•共變數與反變數(Covariance and Contravariance)
這對多數C#程式設計師來講,也是新鮮的概念,因為以前微軟MSDN(C# 4.0之前)是沒有特別提到什麼是Covariance and Contravariance,初次研讀時也是很不好理解,不容易解釋它,甚至是為什麼要創造它都一頭霧水。但等你真的完全理解時,才發覺,它修正.NET型別系統,將以前邏輯上認為型別相容或轉換應該行得通,實際上卻行不通之事,變成可能,這在C# 4.0和.NET Framework 4.0才支援的。

那什麼是共變數(Covariance) ?Covariance就是將衍生度較高型別(more derived type)指派給衍生度較低型別(less derived type),例如:
IEnumerable<string> foo = new List() { "Kevin", "John", "Mary" };
IEnumerable<object>
bar = foo;

foreach (object b in bar)
{
    Console.WriteLine(b);
}


那什麼是反變數(Contravariance)?它就是在做Covariance反向工作,將衍生度較低型別(less derived type)指派給衍生度較高型別(more derived type)。

所以Covariance and Contravariance一樣是在處理型別問題。

註:Covariance and Contravariance有比較深刻的議題,也有實務用途,但不是本篇解釋的要點,下次有機會再談。

•Office可程式性支援(Office Programmability)
與Office的COM元件程式交互操作性的改良,讓C# 撰寫Office程式變得容易簡單,這主因還是Dynamic型別的功勞。一樣是在圍繞在" 型別"。

•型別對等支援(Type Equivalence Support)
光看標題就含有"型別"字眼,還不用解釋,就自動說明它在解決型別的問題了。但它究竟是在幹什麼呢?為了省點打字力氣,以下摘自一篇MSDN雜誌專欄解釋:
當在原始版本的.NET Framework 中引進 COM Interop 時,建立概念的主要 Interop 組件 (PIA)。 這是嘗試解決問題的共用元件之間的 COM 物件。 如果您具有 [不同 Interop 組件定義的 Excel 工作表我們 wouldn’t 無法共用這些工作表元件,之間因為他們是不同的.NET 型別。 PIA 修正這一次現有 — 所有的用戶端使用它,和.NET 型別永遠相符。 (意思你在寫Office程式時,如果Client PC灌的是不同版本的Office,你程式不用重寫,不必重新編譯)


所以呀,C# 4.0語言新功能,看似在講一堆雜七雜八,不曉得幹什麼用,不知如何用,不知有沒有用的語法功能,最後祭司總結兩個字"型別",一切都是從型別為出發點,各自衍生出不同的應用故事。你覺得呢?

註:
因為型別是C# 4.0的出發點,一切的重點主軸,想要徹底了解C# 4.0到底有什麼重大革命,有個衍生迴避不了的問題,就是" 靜態語言 vs. 動態語言"的概念,下次詳細解釋這兩個個性截然不同的語言故事。


Web Application Toolkit for Template Driven Email簡介與操作示範←上一篇 │首頁│ 下一篇→Visual Studio 11 Beta版開放下載與安裝心得
本文引用網址: