C#中dynamic的正確用法


  C#是類型安全的編程語言。意味着所有表達式都解析成類型的實例,編譯器生成的代碼只執行對該類型有效的操作。dynamic的出現讓C#具有了弱語言類型的特性,有利於處理需要在運行時才會知曉的信息,如果寫的是純C#應用程序,只有在使用反射的時候,才需要和運行時才能確定的信息打交道。編譯器在編譯的時候不再對類型進行檢查,編譯期默認dynamic對象支持你想要的任何特性。

  var關鍵字和dynamic做比較。實際上,var和dynamic完全是兩個概念,var實際上是編譯器拋給我們的“語法糖”,一旦被編譯,編譯器會自動匹配var 變量的實際類型,並用實際類型來替換該變量的聲明,這看上去就好像我們在編碼的時候是用實際類型進行聲明的。而dynamic被編譯后,實際是一個object類型,只不過編譯器會對dynamic類型進行特殊處理,讓它在編譯期間不進行任何的類型檢查,而是將類型檢查放到了運行期。

  class Program

  {

  static void Main(string[] args)

  {

  //與var不同,聲明時不需要初始化

  dynamic value;

  for (int i = 0; i < 2; i++)

  {

  value = (i == 0) ? (dynamic)12 : (dynamic)"X";

  Console.WriteLine(value);

  }

  Console.ReadKey();

  }

  }

  

 

  這從visual studio的編輯器窗口就能看出來。以var聲明的變量,支持“智能感知”,因為visual studio能推斷出var類型的實際類型,而以dynamic聲明的變量卻不支持“智能感知”,因為編譯器對其運行期的類型一無所知。對dynamic變量使用“智能感知”,會提示“此操作將在運行時解析”。

  關於dynamic變量是一個object變量這一點,可以通過IL代碼得到驗證。當然,編譯器也對dynamic聲明進行了處理,以區別直接object變量。

  如果字段、方法參數或方法返回值的類型是dynamic,編譯器會將類型轉換為System.Object,並在元數據中間字段、參數或返回類型應用System.Runtime.CompilerServices.DynamicAttribute的實例。如果局部變量被指定為dynamic,變量類型也會成為Object,但不會向局部變量應用DynamicAttribute,因為它限制在方法內部使用。由於dynamic其實就是object,所以方法簽名不能僅靠dynamic和Object的變化來區分。

  所有表達式都能隱式轉型為dynamic,因為所有表達式最終都生成從Object派生的類型。從Dynamic轉型為其他類型時,雖然編譯器允許省略顯示轉型,但CLR會在運行時驗證轉型來確定類型安全性。

  {無錫人流醫院哪家好 http://www.wxbhnkyy120.com/

  //即將要匹配的對象

  object target = "xu shuai";

  //即將要匹配的參數

  object arg = "shu";

  //在目標上查找和希望的實參類型匹配的方法,匹配沒有,則返回null

  Type[] types = new Type[] { arg.GetType() };

  MethodInfo method = target.GetType().GetMethod("Contains", types);

  //在目標上調用方法,傳遞希望的實參

  if (method != null)

  {

  object[] arguments = new object[] { arg };

  Boolean res = Convert.ToBoolean(method.Invoke(target, arguments));

  Console.WriteLine(res);

  }

  else

  {

  Console.WriteLine("");

  }

  }

  {

  //使用dynamic

  dynamic target = "xu shuai";

  dynamic arg = "shu";

  Boolean re = target.Contains(arg);

  Console.WriteLine(re);

  }

  Dynamic的一個限制是只能訪問對象的實例成員,因為dynamic變量必須引用對象。但有時需要動態調用運行時才能確定的一個類型的靜態成員。


免責聲明!

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



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