var和dynamic的區別及如何正確使用dynamic?


1.var與dynamic的區別

    C#中的很多關鍵詞用法比較容易混淆,var和dynamic就是其中一組,但其實它們是有本質的區別的。var 在編譯階段已經確定類型,在初始化時候,必須提供初始化的值,而dynamic則可以不提供,它是在運行時才確定類型。

 1         static void Main(string[] args)
 2         {
 3             //var 在編譯階段已經確定類型
 4             var number = 3;
 5 
 6             //dynamic在編譯期間不進行任何的類型檢查,而是將類型檢查放到了運行期
 7             dynamic dyn = 3;
 8 
 9             dyn = "hello world";
10 
11             //runtime eror
12             //字符串沒有 "fn不存在的方法" 的方法,但在語法檢查時通過,不會提示語法錯誤
13             var s = dyn.fn不存在的方法();
14 
15             Console.ReadKey();
16         }

2.ExpandoObject類型的使用

    當我們因為某種目的而需要創建一些臨時類型的變量時,我們可以會像下面這樣做:

 

1 var a = new { Name = "Paul Huang", Age = 24 }; 2 
3 Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age);

 

    現在要介紹一種新的類型ExpandoObject,它是專為動態行為而設計的類型,用法如下:

 1        static void Main(string[] args)  2  {  3             dynamic a = new ExpandoObject();  4 
 5             a.Name = "Paul Huang";  6 
 7             a.Age = 24;  8 
 9             Console.WriteLine("Name is {0},Age is {1}", a.Name, a.Age); 10 12         }

     實際上,ExpandoObject類顯式實現了 IDictionary<string,object> 接口,所以,我們可以知道,其實它里面就是用一個字典來存儲動態賦值的數值的,鍵的類型為字符串,表示屬性名;值的類型為object,表示任何類型。

     咱們把它里面的字典數據輸出來:

1             IDictionary<string, object> dic = a as IDictionary<string, object>;
2 
3             foreach (var pv in dic)
4             {
5                 Console.WriteLine("Key = {0} , Value = {1}", pv.Key, pv.Value);
6             }

     所為為什么不管你如何動態設置屬性,它都可以進行解析,就是這個原因,里面用一個字典來負責存取數據。

3.dynamic在反射時的應用

  由於dynamic在運行時才檢查類型,所以有時候會出現錯誤,因此使用它必須得法,那么何時使用它比較方便呢?我們先定義一個Person類,然后用反射進行動態調用起Talk方法:

1     class Person
2     {
3           public void Talk(string msg)
4         {
5             Console.WriteLine(msg);
6         }
7     }
 1      class Program
 2     {
 3           static void Main(string[] args)
 4         {
 5             Type t = typeof(Person);
 6 
 7             Object obj = Activator.CreateInstance(t);
 8 
 9             t.InvokeMember("Talk", BindingFlags.InvokeMethod, null, obj, new object[] { "hello world" });
10 
11           Console.ReadKey();
12         }
13     }

   

     在反射的時候,傳統的方法的方法調用往往比較繁瑣,而用dyanmic則非常簡化,而且直觀:

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Type t = typeof(Person);
 6 
 7             dynamic obj = Activator.CreateInstance(t);
 8 
 9             obj.Talk("hello world");
10 
11             Console.ReadKey();
12         }
13     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM