咨詢電話:023-6276-4481
熱門文章
電 話:023-6276-4481
郵箱:broiling@qq.com
地址:重慶市南岸區(qū)亞太商谷6幢25-2
dynamic元類型
C# 4.0將通過新的元類型"dynamic"來添加對后期綁定的支持。任何直接聲明為這種類型的變量,或者從函數(shù)中返回這種類型的值,都將自動地視為后期綁定。這類似于在Visual Basic中把變量聲明為"object",不過它現(xiàn)在可以支持任何類型系統(tǒng)了,不僅僅是CTS(通用類型規(guī)范)和COM。
一個重要之處是,這個特性的目標就是為了支持后期綁定,以及更多地為了支持近來流行的動態(tài)綁定。動態(tài)類型明顯不是C#的一個特性,不過是為了支持動態(tài)綁定的一個后果。
還要著重注意的一點是,反射并不是一種很好的替代方案。使用反射的問題在于,需要處理各種各樣的類型。使用Reflection命名空間調(diào)用方法的方式和在ScriptObject上調(diào)用方法的方式并不相同。尤其,Ruby/Python方法這樣的第三方方法。
dynamic ExpandoObject
熟悉js的朋友都知道js可以這么寫 :
var t = new Object();
t.Abc = "something";
t.Value = 243;
現(xiàn)在這個js動態(tài)語言的特性,我們也可以在c#中使用了,前提是將一個變量聲明為ExpandoObject類型。如下例:
static void Main(string[] args)
{
dynamic t = new ExpandoObject();
t.Abc = "abc";
t.Value = 10000;
Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value);
Console.ReadLine();
}
C# 4.0中新增了一個命名空間System.Dynamic來實現(xiàn)對此應用的支持,這種用法的意義何在,現(xiàn)在我還不太清楚,也是是c#向動態(tài)語言過渡的一種試探吧。以下展示的是dynamic可變類型特性
dynamic d = 1;
Console.WriteLine(d.ToString());
d = new DateTime();
Console.WriteLine(d.ToString());
d = "szl";
Console.WriteLine(d.ToString());
dymanic應用場景
按New features in CSharp 4的說法,dymanic主要應用于下面的場景:
1、自動反射
2、COM組件互操作
3、混合編程,例如IronRuby和IronPython
4、處理Html DOM對象
如果有處理過上面這些工作的朋友們,應該不難理解了吧。
有了dynamic的支持讓我們看下更強大的功能吧:
反射調(diào)用
Type type = Type.GetType("ConsoleApplication1.Test");
dynamic t = Activator.CreateInstance(type);
t.Print("你好,szl,歡迎使用 CSharp 4.0!");
這里我們之間調(diào)用了ConsoleApplication1.Test類型中的Print方法,就行創(chuàng)建實例后調(diào)用一樣,是不是很方便。
P/Invoke 調(diào)用
dynamic user32 = new DynamicDllImport("user32.dll",
callingConvention: CallingConvention.Winapi);
user32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);
DynamicDllImport是Mono發(fā)布的一個類,利用它我們可以直接調(diào)用WinAPI,這里調(diào)用了MessageBox函數(shù)。詳細內(nèi)容我會在下一篇文章《.NET4.0新特性之互操作》進行介紹。
動態(tài)語言運行
動態(tài)語言運行時 (DLR) 是一種運行時環(huán)境,它將一組適用于動態(tài)語言的服務添加到公共語言運行時 (CLR)。借助于 DLR,可以更輕松地開發(fā)要在 .NET Framework 上運行的動態(tài)語言,而且向靜態(tài)類型化語言添加動態(tài)功能也會更容易。
動態(tài)語言可以在運行時標識對象的類型,而在類似 C# 和 Visual Basic 的靜態(tài)類型化語言中(當您使用 Option Explicit On 時),您必須在設計時指定對象類型。動態(tài)語言的示例有:Lisp、Smalltalk、JavaScript、PHP、Ruby、Python、ColdFusion、Lua、Cobra 和 Groovy。
大多數(shù)動態(tài)語言都會向開發(fā)人員提供以下優(yōu)點:
可以使用快速反饋循環(huán)(REPL 或讀取-計算-打印循環(huán))。這樣,您就可以在輸入幾條語句之后立即執(zhí)行它們以查看結(jié)果。
同時支持自上而下的開發(fā)和更傳統(tǒng)的自下而上的開發(fā)。例如,當您使用自上而下的方法時,可以調(diào)用尚未實現(xiàn)的函數(shù),然后在需要時添加基礎實現(xiàn)。
更易于進行重構(gòu)和代碼修改操作,原因是您不必在代碼中四處更改靜態(tài)類型聲明。
利用動態(tài)語言可以生成優(yōu)秀的腳本語言。利用新的命令和功能,客戶可以輕松地擴展使用動態(tài)語言創(chuàng)建的應用程序。動態(tài)語言還經(jīng)常用于創(chuàng)建網(wǎng)站和測試工具、維護服務器場、開發(fā)各種實用工具以及執(zhí)行數(shù)據(jù)轉(zhuǎn)換。
DLR 的目的是允許動態(tài)語言系統(tǒng)在 .NET Framework 上運行,并為動態(tài)語言提供 .NET 互操作性。在 Visual Studio 2010 中,DLR 將動態(tài)對象引入到 C# 和 Visual Basic 中,以便這些語言能夠支持動態(tài)行為,并且可以與動態(tài)語言進行互操作。
DLR 還可幫助您創(chuàng)建支持動態(tài)操作的庫。例如,如果您具有一個使用 XML 或 JavaScript 對象表示法 (JSON) 對象的庫,則對于使用 DLR 的語言,您的對象可以顯示為動態(tài)對象。這使庫用戶能夠編寫語法更簡單且更自然的代碼,以便操作對象和訪問對象成員。