不清楚 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,介紹得可真棒!
沒有留言:
張貼留言