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變量必須引用對象。但有時需要動態調用運行時才能確定的一個類型的靜態成員。