自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解.NET 4.0新特性Dynamic相關(guān)知識(shí)

開(kāi)發(fā) 后端
本文將為大家介紹.NET 4.0新特性Dynamic相關(guān)知識(shí),預(yù)計(jì)正式版本將于2010年一季度發(fā)布。

2010年一季度Visual Studio 2010和.NET 4.0將發(fā)布正式版,在這里我們將先體驗(yàn)一下.NET 4.0新特性Dynamic及其相關(guān)知識(shí),希望對(duì)大家有所幫助。

前段時(shí)間看過(guò)一些關(guān)于dynamic這個(gè)C#4中的新特性,看到有些朋友認(rèn)為dynamic的弊大于利,如無(wú)法使用編譯器智能提示,無(wú)法在編譯時(shí)做靜態(tài)類(lèi)型檢查,性能差等等。因此在這篇文章中我將就這些問(wèn)題來(lái)對(duì)dynamic做一個(gè)較詳細(xì)的介紹,希望通過(guò)這篇文章,能使大家對(duì)dynamic關(guān)鍵字有個(gè)更深入的認(rèn)識(shí)。

#T#

dynamic介紹

相信很多人應(yīng)該都已經(jīng)對(duì)Anders Hejlsberg在PDC2008上所做的那篇”The Future of C#”(注1) 都有所了解了,當(dāng)時(shí)的這篇演講已經(jīng)介紹了C#4.0的一些最重要的特性。Anders提到C#的未來(lái)時(shí)候指出C#4.0的特點(diǎn)是動(dòng)態(tài)編程,他同時(shí)也列舉了很多在4.0中關(guān)于動(dòng)態(tài)編程的例子,這里我具體講一講他首先提到的dynamic關(guān)鍵字。

提到dynamic,我首先想到的是var關(guān)鍵字。事實(shí)上,當(dāng)var在C#3.0中剛剛出現(xiàn)的時(shí)候就引起了一些人的質(zhì)疑,后來(lái)微軟解釋var只是隱含類(lèi)型聲明符,并且只能用作局部變量,它其實(shí)仍然是強(qiáng)類(lèi)型,只不過(guò)是編譯器由初始化結(jié)果推斷而來(lái),所以對(duì)這個(gè)變量仍然可以可以使用VS的只能提示。現(xiàn)在dynamic則真正往動(dòng)態(tài)特性邁進(jìn)了一大步,根據(jù)Anders的解釋?zhuān)琩ynamic是指動(dòng)態(tài)的靜態(tài)類(lèi)型,也就是說(shuō)它本質(zhì)上仍然是靜態(tài)類(lèi)型,只不過(guò)它告訴編譯器忽略對(duì)它的靜態(tài)類(lèi)型檢查,它會(huì)在運(yùn)行時(shí)才進(jìn)行類(lèi)型檢查,它可以應(yīng)用在基本上所有的C#類(lèi)型上面,如方法,操作符,索引器,屬性,字段,它其實(shí)是通過(guò)統(tǒng)一的方式來(lái)調(diào)用方法、屬性等操作。

dynamic主要用與需要與外界(COM,DLR,HTML DOM,XML等)的交互的場(chǎng)合,在這些時(shí)候,你很可能不能確定這些對(duì)象的具體類(lèi)型而僅僅知道它的一些屬性,如方法等,因此這些時(shí)候你僅僅告訴編譯器你需要在程序運(yùn)行這里執(zhí)行這些方法,至于操作對(duì)象是什么,你可能并不關(guān)心。這個(gè)時(shí)候,靜態(tài)類(lèi)型無(wú)法幫你解決問(wèn)題,因?yàn)樗鼈兪窃诰幾g時(shí)就已經(jīng)決定了的,反射雖然能做大,但畢竟太麻煩,而且效率較低。因此dynamic適時(shí)的出現(xiàn)了,它用編譯時(shí)類(lèi)型檢查缺失的代價(jià)來(lái)實(shí)現(xiàn)讓程序員看起來(lái)很干凈的代碼。

dynamic的聲明和使用很簡(jiǎn)單,跟javascript中的var基本是一致的。需要注意的是,在編譯代碼之前我們首先需要安裝VS 2010 Beta2或Visual C# Express 2010,我這里安裝的是C# Express(注2)。e.g.代碼1:

  1. class Program{static void main()  
  2. {  
  3. dynamic a=7;a.Error=”Error”;a=”Test”;a.Run();  
  4. }} 

這段代碼可以通過(guò)編譯,但無(wú)法運(yùn)行。C#編譯器允許你對(duì)a對(duì)象調(diào)用任何方法或其他成員,它并不會(huì)在編譯時(shí)檢查這些成員調(diào)用是否合法,取而代之的是,編譯器會(huì)在運(yùn)行時(shí)檢查實(shí)際的對(duì)象是否具有相應(yīng)的方法,如果有,則調(diào)用,否則,CLR會(huì)拋出異常。如,下面的代碼將可以正常執(zhí)行:

  1. static dynamic Sum(dynamic obj1,dynamic obj2){    
  2. return obj1.Age+obj2.Age;  
  3. }  
  4. static void main(){  
  5. var animal=new{Sex=”Male”,Age=”5”};  
  6. var plant=new{Class=”草本”,Age=100};  
  7. dynamic ageCount=Sum(animal+plant);} 
 

這里我們對(duì)兩個(gè)不同對(duì)象的年齡相加,在sum函數(shù)中,我們根本就不關(guān)心我們調(diào)用的對(duì)象是什么,而僅僅需要知道他們都有Age成員,并且這個(gè)成員能夠進(jìn)行+操作符運(yùn)算。事實(shí)上,在與DLR的交互和Silverlight中,這種場(chǎng)景將會(huì)大量存在,因此dynamic在這些場(chǎng)合將會(huì)非常有用。

探討玩使用情況之后我們?cè)賮?lái)看看dynamic到底是如何實(shí)現(xiàn)的。實(shí)際上通過(guò)Reflector查看代碼你會(huì)發(fā)現(xiàn)它顯示的代碼是這樣的:


 
  1. internal class Program
  2. {    // Methods    private static void Main(string[] args)     
  3.  {        object a = 7;          
  4. if (<Main>o__SiteContainer0.<>p__Site1 == null)        {              
  5. <Main>o__SiteContainer0.<>p__Site1 =   
  6. CallSite<Func<CallSite, objectstringobject>>.Create  
  7. (Binder.SetMember(CSharpBinderFlags.None, "Error"typeof(Program), new CSharpArgumentInfo[] 
  8. { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None,  
  9.  null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.LiteralConstant | CSharpArgumentInfoFlags.UseCompileTimeType,   
  10. null) }));          
  11. }        <Main>o__SiteContainer0.<>p__Site1.Target  
  12. (<Main>o__SiteContainer0.<>p__Site1, a, "Error");   
  13.        a = "Test";          
  14. if (<Main>o__SiteContainer0.<>p__Site2 == null)    
  15.       {             
  16.  <Main>o__SiteContainer0.<>p__Site2 = CallSite<Action<CallSite, object>>.Create(Binder.InvokeMember  
  17. (CSharpBinderFlags.ResultDiscarded, "Run"nulltypeof(Program), new CSharpArgumentInfo[]   
  18. { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }));  
  19.         }        <Main>o__SiteContainer0.<>p__Site2.Target(<Main>o__SiteContainer0.<>p__Site2, a);   
  20.    }    // Nested Types    [CompilerGenerated]    private static class <Main>o__SiteContainer0      
  21. {        // Fields        public static CallSite<Func<CallSite, object, string, object>> <>p__Site1;   
  22.        public static CallSite<Action<CallSite, object>> <>p__Site2;   
  23.    }} 

大家可以可以從代碼中看到,實(shí)際上dynamic對(duì)象就是object對(duì)象,在編譯的時(shí)候編譯器會(huì)給每個(gè)不同的方法在類(lèi)的嵌套靜態(tài)類(lèi)SiteContainer生成不同的CallSite字段,這些CallSite會(huì)將綁定調(diào)用方法的信息,當(dāng)需要真正調(diào)用方法的時(shí)候,它會(huì)調(diào)用由編譯器生成的嵌套靜態(tài)類(lèi)SiteContainer中的CallSite來(lái)調(diào)用實(shí)際方法,這里CLR通過(guò)將調(diào)用的方法設(shè)置為靜態(tài)變量來(lái)達(dá)到Cache的目的,也就是如果該方法是第一次調(diào)用,那么它會(huì)創(chuàng)建該類(lèi)型,否則,它會(huì)直接調(diào)用之前生成的靜態(tài)CallSite類(lèi)型來(lái)調(diào)用實(shí)際方法。這對(duì)大批量重復(fù)操作來(lái)說(shuō),可以顯著提高效率。我將在后文對(duì)此進(jìn)行詳細(xì)測(cè)試。

使用舉例

好了,介紹完dynamic之后我們來(lái)討論下這個(gè)新特性的使用場(chǎng)景吧,關(guān)于dynamic的使用例子,其實(shí)Anders 在他的演講中已經(jīng)展示了很多例子。我這里首先對(duì)這些例子做個(gè)總結(jié),1. SilverLight中與javascript交互,在視頻中他不僅演示了我們?nèi)绾握{(diào)用HTML中的Javascript 方法,Anders甚至給我們演示了如何直接在C#代碼中加入Javascipt方法;2. 這個(gè)例子是C#和動(dòng)態(tài)語(yǔ)言IronPython交互的情況,在這個(gè)例子中,他演示我們?nèi)绾沃苯诱{(diào)用一個(gè)在Python中定義的Calculate方法。3. 除了這些,他還演示了通過(guò)Dynamic干凈直觀(guān)的操作XML。

這里我額外補(bǔ)充兩個(gè)使用dynamic的例子,實(shí)際上這只是我提供的一種思路,如果你覺(jué)得他們的實(shí)現(xiàn)并不好,我很歡迎你提出不同的意見(jiàn)或更恰當(dāng)?shù)睦印?/p>

1. 讓泛型支持操作符重載。

   我曾經(jīng)在復(fù)習(xí)泛型的時(shí)候提到過(guò).NET泛型是不支持操作符的,因?yàn)椴僮鞣蔷幾g器決定的,而泛型是運(yùn)行時(shí)決定。所以如果你想對(duì)兩個(gè)泛型變量進(jìn)行+的操作是無(wú)法通過(guò)編譯的。事實(shí)上,在Linq實(shí)現(xiàn)Sum操作的時(shí)候也是通過(guò)對(duì)所有基本數(shù)據(jù)類(lèi)型(e.g.int,long)的重載來(lái)實(shí)現(xiàn)的。但有了dynamic,這種操作將變得可能。e.g.

  1. class MyList<T>{      
  2. public List<T> Items { getset; }      
  3. public T Sum()    {          
  4. dynamic result = default(T);          
  5. foreach (var temp in Items)         
  6.  {             
  7.  result += temp;        }         
  8.  return result;    }} 

這里由于我們將Result聲明為dynamic類(lèi)型,所以編譯器不會(huì)檢查其是否能進(jìn)行+操作,但這里我們有個(gè)契約就是這個(gè)求和函數(shù)中的類(lèi)型應(yīng)支持+運(yùn)算?,F(xiàn)在我們可以對(duì)這個(gè)類(lèi)進(jìn)行如下操作:

  1. MyList<int> l1=new MyList<int>()…dynamic  a= l1.Sum();  
  2. MyList<String> l2=new MyList<String>()…. a=l2.Sum(); 

另外一個(gè)就是XML操作了,由于XML中所有的屬性都是string類(lèi)型的,但有時(shí)我們又卻是需要使用其實(shí)際類(lèi)型,這時(shí)dynamic也很有用。這里給出我看到的一個(gè)認(rèn)為不錯(cuò)的例子,你可以參看這篇文章:

首先我們定義一個(gè)繼承DynamicObject的動(dòng)態(tài)類(lèi)型。

[[7899]][[7900]]代碼
 
  1. public class DynamicXMLNode : DynamicObject{      
  2. XElement node;      
  3. public DynamicXMLNode(XElement node)    {     
  4.    this.node = node;      
  5. }      
  6. public DynamicXMLNode()     
  7.  {    }     
  8. public DynamicXMLNode(String name)    
  9.   {        node = new XElement(name);     
  10.  }     
  11. public override bool TrySetMember(      
  12.   SetMemberBinder binder, object value)      
  13. {          
  14. XElement setNode = node.Element(binder.Name);          
  15. if (setNode != null)              
  16. setNode.SetValue(value);          
  17. else        {              
  18. if (value.GetType() == typeof(DynamicXMLNode))                  
  19. node.Add(new XElement(binder.Name));   
  20.            else                  
  21. node.Add(new XElement(binder.Name, value));          
  22. }          
  23. return true;      
  24. }      
  25. public override bool TryGetMember(GetMemberBinder binder, out object result)      
  26. {          
  27. XElement getNode = node.Element(binder.Name);          
  28. if (getNode != null)          
  29. {              
  30. result = new DynamicXMLNode(getNode);             
  31.  return true;        }         
  32.  else        {         
  33.      result = null;         
  34.      return false;         
  35.  }    }} 

定義好動(dòng)態(tài)XML節(jié)點(diǎn)類(lèi)之后,我們可以像下面這樣使用它。

 
  1. dynamic contact = new DynamicXMLNode  
  2. ("Contacts");contact.Name = "Patrick   
  3. Hines";contact.Phone = "206-555-0144";  
  4. contact.Address = new DynamicXMLNode();  
  5. contact.Address.Street = "123 Main St";  
  6. contact.Address.City = "Mercer Island";  
  7. contact.Address.State = "WA";contact.Address.Postal = "68402"

是不是真正做到了XML對(duì)象和C#對(duì)象的無(wú)縫銜接了?

不足

1. 無(wú)法支持?jǐn)U展方法。由于擴(kuò)展方法能否被加載是根據(jù)上下文,如DLL的引用和命名空間的引用這些靜態(tài)信息來(lái)獲取的,目前dynamic還不支持調(diào)用擴(kuò)展方法。這也意味著Linq沒(méi)辦法被dynamic支持。

2.無(wú)法支持匿名方法。匿名方法(Lamda表達(dá)式)無(wú)法作為一個(gè)動(dòng)態(tài)方法調(diào)用的參數(shù)傳遞。編譯器沒(méi)辦法獲取一個(gè)匿名方法的具體類(lèi)型,所以它也就沒(méi)辦法綁定匿名方法了。

性能?

很多朋友考慮dynamic一個(gè)很重要的缺點(diǎn)就是認(rèn)為它本質(zhì)還是object類(lèi)型,只不過(guò)CLR在運(yùn)行時(shí)候通過(guò)反射來(lái)達(dá)到動(dòng)態(tài)調(diào)用的目的。確實(shí)沒(méi)錯(cuò),跟普通方法調(diào)用比較,動(dòng)態(tài)類(lèi)型的方法在第一次調(diào)用的時(shí)候要做很多的事情,它需要把調(diào)用的信息存放起來(lái),然后在真正用到這個(gè)方法的時(shí)候通過(guò)CallSite.Create()來(lái)調(diào)用實(shí)際的方法,當(dāng)然這個(gè)Create里面也是通過(guò)反射來(lái)達(dá)到目的的。

不過(guò)這是否意味著dynamic還不如反射的性能呢?答案是否的,事實(shí)上,看我上面的代碼你會(huì)發(fā)現(xiàn),動(dòng)態(tài)對(duì)象在每次調(diào)用方法的時(shí)候都會(huì)先判斷這個(gè)callSite對(duì)象是否是空的,如果不是空的,它可以直接調(diào)用而不需要重新實(shí)例化,所以如果你的對(duì)象的方法需要有很多重復(fù)使用的時(shí)候,它的性能其實(shí)并不會(huì)太差。下面我將給出測(cè)試的代碼。

這里我的測(cè)試目標(biāo)是對(duì)一個(gè)大型數(shù)組進(jìn)行求和操作,在這個(gè)測(cè)試中,由于系統(tǒng)是XP,我使用了裝配腦袋寫(xiě)的性能計(jì)數(shù)器,你可以參看對(duì)老趙寫(xiě)的簡(jiǎn)單性能計(jì)數(shù)器的修改。首先,我需要定義一個(gè)支持+操作符的結(jié)構(gòu)(我本來(lái)想直接使用int,但測(cè)試的時(shí)候不知為何int的相加運(yùn)算符無(wú)法調(diào)用)

  1. public struct MyData{      
  2. public int Value;      
  3. public MyData(int value)      
  4. {          
  5. this.Value = value;      
  6. }      
  7. public static MyData operator +(MyData var1,MyData var2)      
  8. {          
  9. return new MyData(var1.Value+var2.Value);   
  10.    }}  

然后我為了免去重復(fù)初始化列表的過(guò)程,我簡(jiǎn)單將普通方法調(diào)用,Dynamic方式調(diào)用和反射調(diào)用設(shè)計(jì)成一個(gè)嵌套類(lèi),見(jiàn)代碼:

 
  1. public class MyTest{     
  2.  public static List<MyData> Items   
  3. getset;  
  4.  }      
  5. public MyTest(int count)      
  6. {        Items = new List<MyData>(count);  
  7.         for (int i = 0; i < count; i++)        {            Items.Add(new MyData(1));   
  8.        }    }      
  9. public void Run()      
  10. {          
  11. Console.WriteLine("Compare Times:  
  12. {0}",Items.Count);    
  13.       CodeTimer.Time("Common", 1, new TestCommon());   
  14.        CodeTimer.Time("Dynamic", 1, new TestDynamic());   
  15.        CodeTimer.Time("Reflect", 1, new TestReflect());   
  16.    }    
  17.   public class TestCommon : IAction      
  18. {        public MyData Result { getset; }    
  19.       public void Run()         
  20.  {            Result = default(MyData);            foreach (var d in Items)              
  21. {                Result += d;             
  22.  }        }    }      
  23. public class TestDynamic : IAction     
  24.  {        public dynamic Result { getset; }        public void Run()         
  25.  {              
  26. Result = default(dynamic);              
  27. foreach (dynamic d in Items)              
  28. {                Result += d;    
  29.           }        }    
  30.   }      
  31. public class TestReflect : IAction      
  32. {        public MyData Result { getset; }          
  33. public void Run()         
  34.  {            Result = default(MyData);  
  35.             Type type = typeof(MyData);   
  36. MethodInfo m = type.GetMethod("op_Addition", BindingFlags.Public | BindingFlags.Static);    
  37.           foreach (var d in Items)            {                  
  38. Result = (MyData)(object)m.Invoke(nullnew object[] { Result, d });     
  39.          }        }    }}  

最后是調(diào)用方法:

  1. static void main(){      
  2. MyTest test = new MyTest(100000);      
  3. test.Run();      
  4. test = new MyTest(1000000);      
  5. test.Run();      
  6. test = new MyTest(10000000);      
  7. test.Run();}  

最后我將給出測(cè)試結(jié)果,不過(guò)我發(fā)現(xiàn)每次測(cè)試結(jié)果數(shù)據(jù)好像都有所不同,但數(shù)據(jù)規(guī)律大致相似。

 

普通方法

動(dòng)態(tài)調(diào)用

反射

數(shù)組大小

100,000

Time Elapsed

9ms

274ms

442ms

Time Elapsed (one)

9ms

274ms

442ms

CPU time

15,625,000ns

296,875,000ns

484,375,000ns

CPU Time (one)

15,625,000ns

296,875,000ns

484,375,000ns

Gen 0

0

1

5

Gen 1

0

0

0

Gen 2

0

0

0

數(shù)組大小

1,000,000

Time Elapsed

42ms

244ms

3,736ms

Time Elapsed (one)

42ms

244ms

3,736ms

CPU time

62,500,000ns

281,250,000ns

4,140,625,000ns

CPU Time (one)

62,500,000ns

281,250,000ns

4,140,625,000ns

Gen 0

0

7

20

Gen 1

0

0

0

Gen 2

0

0

0

數(shù)組大小

10,000,000

Time Elapsed

585ms

2,553ms

40,763ms

Time Elapsed (one)

585ms

2,553ms

40,763ms

CPU time

656,250,000ns

2,796,875,000ns

43,671,875,000ns

CPU Time (one)

656,250,000ns

2,796,875,000ns

43,671,875,000ns

Gen 0

0

30

205

Gen 1

0

1

4

Gen 2

0

0

0

從表格中我們大致可以看出,直接調(diào)用方法最快,并且產(chǎn)生的對(duì)象最少。通過(guò)反射方式不僅時(shí)間往往耗費(fèi)較多,而且還會(huì)生產(chǎn)大量的對(duì)象。另外我們發(fā)現(xiàn)在1,000,000反而比100,000花費(fèi)的時(shí)間要少,但生成的對(duì)象確實(shí)增多了。這一點(diǎn)我不太明白,同樣的對(duì)象通過(guò)Cache確實(shí)能提高效率,但我不知道為什么多做10倍的加法操作的動(dòng)態(tài)方法調(diào)用反而會(huì)更快。另外,從圖中也可以看出基本上使用dynamic調(diào)用方法花費(fèi)的時(shí)間是直接調(diào)用的5倍左右,在有些時(shí)候,這個(gè)性能損失所做的交換也是值得的。

上面的測(cè)試數(shù)據(jù)基本每次都會(huì)有所變化,但總體走勢(shì)是基本不變的,那就是花費(fèi)時(shí)間common>dynamic>Reflect。因此我們可以認(rèn)為雖然dynamic確實(shí)會(huì)有性能損失,但有時(shí)候如果你的系統(tǒng)確實(shí)需要?jiǎng)討B(tài)生成對(duì)象或動(dòng)態(tài)調(diào)用方法的時(shí)候它還是可以考慮的,特別是如果你系統(tǒng)需要使用反射的而這種類(lèi)型的操作又會(huì)有多次重復(fù)的情況下尤其值得考慮。

后記

關(guān)于dynamic關(guān)鍵字目前還沒(méi)有太多使用的用例,關(guān)于它到底好還是不好的爭(zhēng)論也一直沒(méi)有停止。事實(shí)上,一直到現(xiàn)在,都有很多人對(duì)dynamic持有懷疑和反對(duì)態(tài)度,他們認(rèn)為dynamic性能并不好,而且dynamic的到來(lái)使得編譯器的自動(dòng)完成功能沒(méi)有了,同時(shí)還無(wú)法完成編譯時(shí)成員調(diào)用的檢查,這將使得普通程序員的出錯(cuò)幾率大大增加。

不否認(rèn)dynamic使用不當(dāng)確實(shí)會(huì)導(dǎo)致程序員犯錯(cuò)的幾率大大提高。然而,正如蜘蛛俠說(shuō)的,能力越大,責(zé)任越大。其實(shí)微軟引入dynamic也是給了C#程序員比以往更強(qiáng)大的能力,但這強(qiáng)大的能力使用不當(dāng)也會(huì)造成錯(cuò)誤。不過(guò),我們能因此而說(shuō)這個(gè)能力是丑惡的或者是壞的么?我想,能力其實(shí)沒(méi)有好壞之分,能力的好壞得看使用者,例如核能,同樣的道理,聰明的程序員可以把一個(gè)特性使用得優(yōu)雅高效,而愚蠢的程序員則恰好相反。其次,對(duì)這些動(dòng)態(tài)語(yǔ)言可能存在的問(wèn)題來(lái)說(shuō)我們也可以通過(guò)其他方式盡量來(lái)避免。首先,類(lèi)型或成員調(diào)用合法性的檢查其實(shí)我們可以通過(guò)單元測(cè)試得到最大保證。對(duì)一個(gè)健壯的大型程序來(lái)說(shuō),單元測(cè)試是必要的。其次,使用dynamic之后我們確實(shí)缺少了智能提示,但我并沒(méi)有提倡將dynamic用在所有的地方(事實(shí)上那樣也是錯(cuò)了,因?yàn)樗鼘⒃斐沙绦虻男曙@著降低),我的意思是你僅僅在你真正需要使用dynamic的時(shí)候才去使用它,這正是這個(gè)關(guān)鍵詞存在的理由。而這些需要使用dynamic的地方不會(huì)很多,我們也能明白在這些地方我們要用它來(lái)做什么。有了這兩點(diǎn)保證,我相信dynamic引起的不便也不會(huì)那么明顯。

最后,dynamic只是微軟給我們程序員的更多的一個(gè)選擇,如果你不喜歡它,你當(dāng)然可以在很多場(chǎng)合避免使用它,比如使用類(lèi)型轉(zhuǎn)換,反射等等。用還是不用它,微軟把選擇權(quán)交給了我們程序員自己。另外,你也可以觀(guān)看來(lái)自C# Compiler Team更多關(guān)于Dynamic的介紹:C# 4.0 Dynamic with Chris Burrows and Sam Ng

附注:

注1: The future of C# ,Anders Hejlsberg, http://channel9.msdn.com/pdc2008/TL16/

注2: Visual C# Express 2010下載地址:http://www.microsoft.com/express/future/default.aspx

參考資料:

New features in C# 4.0

結(jié)果截圖:

運(yùn)行截圖 運(yùn)行截圖2

運(yùn)行截圖3

機(jī)器信息:

Thinkpad X200 7654;CPU:Intel Core2 Duo CPU p8400 2.25GHz;虛擬機(jī):VMWare 6.5;虛擬內(nèi)存:1G;虛擬機(jī)操作系統(tǒng):Windows XP;編譯器版本:Visual C# Express 2010 Beta2。

原文標(biāo)題:.NET 4.0 新特性-dynamic

鏈接:http://www.cnblogs.com/jujusharp/archive/2009/12/30/c-sharp-dynamic.html

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-08-19 16:51:14

C# 4.0 dyna

2009-05-26 09:28:22

C# 4.0dynamic動(dòng)態(tài)類(lèi)型

2009-05-26 11:15:31

C# 4.0dynamicVisual Stud

2010-01-05 09:26:13

.NET 4.0

2009-08-10 18:16:33

ICustomQuer.NET 4.0

2012-01-09 16:00:56

2009-09-04 16:28:05

ASP.NET 4.0

2009-12-28 10:04:59

.NET 4.0數(shù)組

2009-08-18 09:37:42

ASP.NET 4.0

2009-12-29 16:02:48

ADO.NET新特性

2010-10-12 09:52:02

ASP.NET MVC

2010-02-24 14:24:35

.NET 4.0

2009-07-06 11:00:56

.NET 4.0新特性.NET

2009-10-27 11:08:25

C# 4.0dynamic

2009-05-25 15:42:03

Visual StudC#

2009-07-24 10:00:38

.NET 4.0內(nèi)存映

2010-10-08 14:32:32

ASP.NET MVCNuPack

2009-07-30 13:17:44

STM.NET.NET 4 Beta

2018-11-15 14:05:24

MongoDB數(shù)據(jù)庫(kù)事務(wù)

2013-07-29 15:13:35

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)