天天看點

《聖殿祭司的ASP.NET4.0專家技術手冊》----2-3 C# 4.0靜态基礎融入動态能力

本節書摘來自異步社群《聖殿祭司的asp.net4.0專家技術手冊》一書中的第2章,第3節,作者: 奚江華,譯者: 武海軍 , 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

聖殿祭司的asp.net4.0專家技術手冊

在了解靜态與動态語言後,大家直覺上可能會以為這是二進制的對立,非黑即白,不是靜态語言,就是動态語言。但您是否想過靜态和動态之間是可以兼具或混合的可能性?例如,靜态語言為擷取動态語言優點,而融入了一些動态語言的功能,然後又保持靜态語言的優勢,如類型安全、優化、高效率。

是的,.net 4.0正是以這個方向去改造,在原本c#、vb靜态語言基礎上,加上動态語言的一些特性與優勢,這樣就達到以靜态為主,動态為輔之目的,讓c#與.net framework比以前更具靈活性。但本來是靜态的.net平台,要怎麼能夠具備動态的能力?簡單來說,以下面兩個要素為基礎,演化.net平台下的動态程式開發故事:

(1)在c# 4.0加入dynamic動态類型;

(2)在.net framework加入新的dlr動态執行引擎。

dynamic動态類型的運用。

c# 4.0引入了一個新的“dynamic”類型,dynamic如同int或string是一個靜态類型(c# 3.0的var就隻是一個關鍵字,而非類型),dynamic可以代表任何類型,文法如下:

但為什麼要發明dynamic類型?這是一個很大的問題,理由有:

擷取動态語言的優勢,讓c#靜态語言也可以擁有動态語言特性;

使用dynamic類型與其他類型語言或元件互操作容易,如com api、html dom,文法會變得十分簡單;

.net framework加入ironpython及ironruby新語言,通過dynamic類型可以很容易與它們互動。

是以在“靜态基礎融入動态能力”的大前提下,并不是要從根本上打亂或放棄既有類型聲明方式,而是與外來語言、com元件或函數庫互操作溝通時,通過dynamic動态類型的能力,使得程式代碼變得十分精簡、容易,這才是最大目的。

警告 在c#程式編寫中,請不要濫用dynamic及var,聲明變量時請維持明确類型聲明習慣(如int、string、double等),隻有對外,如ironpython或ironruby、com元件、函數庫、linq、entity framework互操作時,才采用dynamic及var;否則程式代碼難以閱讀、不易事先檢測文法錯誤,更不易得到visual studio開發工具支援。

dynamic可以代表任何類型,也能夠當成方法參數的類型,一旦變量或對象聲明為dynamic類型後,編譯程式就會略過它的類型檢查或文法錯誤,而是等到runtime執行再評估其正确類型。雖然編譯程式會略過dynamic類型或文法的檢查,但并不表示編譯程式對它完全無作為,編譯程式會将dynamic類型變量編譯成object類型變量,是以大多數情況下,dynamic類型行為模式與object類型相同。

但dynamic與object類型究竟還是有本質上的不同,否則也不必重複創造dynamic,差異點,例如,dynamic運作時會自動進行類型轉換,但object則不會,如:

且由于dynamic類型編譯時不會進行類型或某些文法檢查,甚至可以調用不存在的方法,visual studio或編譯程式也不會提示錯誤,而是運作時才會發生例外錯誤,例如:

《聖殿祭司的ASP.NET4.0專家技術手冊》----2-3 C# 4.0靜态基礎融入動态能力

是以dynamic類型用對地方就能彰顯其效果,誤用則會埋下許多不良的潛在影響。而dynamic類型的應用範圍除了變量外,幾乎能應用在任何的場合,包括了屬性、字段、索引器、參數、傳回值、本機變量或類型條件限制的類型,例如:

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀