首頁 培訓計劃 培訓課程 企業內訓 學員論壇 技術文章 成功案例 師資簡介 關于我們 在線留言  
行業新聞
C#動態特性的更多消息

文章來源:http://www.kuqin.com/dotnet/20090502/49160.html 作者: 發布日期:2009-12-25
打 印】【關 閉

Mads Torgersen給大家展示了C#中dynamic關鍵字的更多詳細信息,以及它的一些具體用法。并談及在選用dynamic關鍵字之前,一些最終被廢棄的替代設計方案。
 
C# 4將通過新的元類型“dynamic”來添加對后期綁定的支持。任何直接聲明為這種類型的變量,或者從函數中返回這種類型的值,都將自動地視為后期綁定。這類似于在Visual Basic中把變量聲明為“object”,不過它現在可以支持任何類型系統了,不僅僅是CTS(通用類型規范)和COM。
 
一個重要之處是,這個特性的目標就是為了支持后期綁定,以及更多地為了支持近來流行的動態綁定。動態類型明顯不是C#的一個特性【譯者注:意指C#是靜態語言,本來無需動態類型的】,不過是為了支持動態綁定的一個后果。
 
還要著重注意的一點是,反射并不是一種很好的替代方案。使用反射的問題在于,需要處理各種各樣的類型。使用Reflection命名空間調用方法的方式和在ScriptObject上調用方法的方式并不相同。尤其,Ruby/Python方法這樣的第三方方法。
 
一種選擇是用波形號作為動態操作的前綴??上?,這種方式馬上也變得難以使用,尤其在你開始研究類型轉換、數組索引和數學操作符的地方:
 object d = GetDynamicObject(); string result = ~(string) d ~[ d~.Length ~- 1];
第三種方案是傳播性的表達式。由于表達式的動態本質將產生向上傳播的問題。
當然,它們選擇的語法也不夠完美。雖然可以讓大家輕易地讀懂代碼,但是沒有任何東西來表明一個動態調用是在實際Call Site當中被創建出來的。唯一看到的信息是這個變量在哪里聲明的。
dynamic d = GetDynamicObject();
string result = (string) d[d.Length - 1];
選用這種設計的關鍵原因是,代碼未必真的不夠安全。進行動態調用本身就像之前拋出異常那樣,不過現在你不用編寫所有臃腫、易出錯的反射邏輯了。
 
另外一個曾考慮過的選擇是用dynamic修飾符來代替元類型。使用這種模式的代碼如下所示,開發人員能夠早期綁定到Foo的方法上,而不是在任何東西上進行后期綁定。雖然這樣可以在一些邊界情況下提高性能,不過它卻增加了總體的復雜等級,這樣的復雜度是難以接受的。
dynamic Foo d = GetDynamicFooObject();
每逢動態組件進入到表達式中,整個表達式將可能成為動態的。這包括:
  • 方法調用
  • 程序調用
  • 成員訪問
  • 操作符運用
  • 索引訪問
例外是相當顯而易見的,轉換和構造器將返回給你靜態上下文。雖然轉換能被DLR類型系統所重寫,但是DLR會把轉換的結果指定為適當的類型。

查看英文原文:More on Dynamic Support in C#
來自:http://www.infoq.com/cn/news/2009/04/Dynamic-CSharp

打 印】【關 閉

上一篇:ASP.NET開發人員需要學習ASP.NET MVC么?
下一篇:如何學習.NET
相關新聞
版權所有©威課網 粵ICP備13058727號