程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C# 4.0初探 - dynamic關鍵字(2)

C# 4.0初探 - dynamic關鍵字(2)

編輯:關於C語言

與關鍵 字var的比較

從表面上看,dynamic與var關鍵字的用法很像,但實質上有 本質區別。

var關鍵字被稱為:隱含類型局部變量(Local Variable Type Inference),var只能用作局部變量,不能用於字段、參數等;聲明的同時必須 初始化;初始化時類型就已經明確了,並且不能再被賦值不能進行隱式類型轉換 的類型的數據;編譯時編譯器會對var定義的變量進行類型推斷,這時變量的類 型已經被確定。

dynamic可用於類型的字段,方法參數,方法返回值,可 用於泛型的類型參數等;可以賦值給或被賦值任何類型並且不需顯式的強制類型 轉換,因為這些是運行時執行的,這要得益於dynamic類型的動態特性。

與反射的比較

首先能看到的是,dynamic與反射相比,執行相同操作所需 的代碼少的多。

如調用類Me中的GetName()方法。

class Me
{
    public string Blog { get; set; }

    public string GetName()
    {
        return "Zhenxing Zhou";
    }
}

用反射調用GetName()方法:

Assembly a = Assembly.GetExecutingAssembly();
object instance = a.CreateInstance ("Xianfen.Net.TestDynamic.Me");
Type type = instance.GetType();
MethodInfo mi = type.GetMethod("GetName");
object result = mi.Invoke(instance, null);

同樣的dynamic 調用:

dynamic myInfo = new Me();
string result = myInfo.GetName();

dynamic類型與反射相比能 進行的操作要少的多。

目前dynamic類型對屬性調用是不可用的,但我們 知道,屬性生成IL時,對屬性的讀或寫會生成對應的在屬性名前加上get_或set_ 前綴生成相應的方法,嘗試調用兩個方法來訪問屬性:

dynamic myInfo = new Me();
myInfo.set_Blog("http://www.xianfen.Net/");
string result = myInfo.get_Blog();

會拋出異常,提示找不到 get/set_Blog方法。這點比較遺憾,同樣,對有參屬性的訪問也是不行的。

反射還可以訪問私有方法字段以及其它類型成員及取得類型及類型成員 的信息等

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved