2010年3月30日 星期二

C# 4.0 dynamic 關鍵字與 ExpandoObject

昨天翻了一下 Apress 的 Introducing .NET 4.0,看到動態語言特性的部分,一個很面熟的 expando 字眼出現在面前,它是 ExpandoObject

不清楚 expando 一詞多久以前就出現了,但是如果是 JavaScript 就不能不提 expando 特性,它讓任何一個物件能隨時隨地的被賦予新成員 (包含屬性和函式)
// JavaScript
var data = new Object();
data.name = "Dino";
data.sex = "Male";
另一種 JavaScript 等價程式碼 (JSON 表示法)
// JavaScript
var data = { name: "Dino", sex: "Male" };
程式執行下來 data 含有 name、sex 這兩個屬性,並且值也被賦予了,我不必先為他產生類別定義,多麼簡單直覺!

回到主題,在 ExpandoObject 就有這樣的精神,在 MSDN 中你能夠找到類似的範例程式:
// C# 4.0
dynamic sampleObject = new ExpandoObject();
sampleObject.Name = "Dino";
sampleObject.Sex = "Male";
(呵,懂得 JavaScript 的設計師應該馬上就能會心一笑吧)

為了支援在程式碼中存取不明確的類別成員而不被編譯器判出局,C# 增加了 dynamic 關鍵字,用來使編譯器繞過型別檢查。

不過 dynamic 的用途可更大著,它在其他方面有更多貢獻。

必須要注意的是,以 C# 3.0 可以達成結果看似相同,但是特性卻截然不同的另一種方式:匿名型別,如下的程式碼,可以產生與前述 C# 4.0 接近的結果
// C# 3.0
var sampleObject = new { Name = "Dino", Sex = "Male" };
不同的地方在於以 ExpandoObject new 出來的新物件還能夠陸續的增加新成員,但是 C# 3.0 的 var sampleObject 卻是一個實實在在的靜態類別,不能、也無法增加新成員。

以 ExpandoObject 產出的實體,要成為 ASP.NET 網頁前端 JSON 的資料來源存取方式,可真是更加簡單了!


最後要推一下,黃先生這篇 C# 4.0 New Feature : Dynamic Programming,介紹得可真棒!

沒有留言: