dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查, 改为在运行时解析这些操作。 该类型简化了对 com api(例如 office automation api)、动态 api(例如 ironpython 库)和 html 文档对象模型 (dom) 的访问。
在大多数情况下,dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。 在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。
以下示例将类型为 dynamic 的变量与类型为 object 的变量对比。 若要在编译时验证每个变量的类型,请将鼠标指针放在 writeline 语句中的 dyn 或 obj 上。 intellisense 显示了 dyn 的“动态”和 obj 的“对象”。
class program
{
static void main(string[] args)
{
dynamic dyn = 1;
object obj = 1;// rest the mouse pointer over dyn and obj to see their
// types at compile time.
system.console.writeline(dyn.gettype());
system.console.writeline(obj.gettype());
}
}
writeline 语句显示 dyn 和 obj 的运行时类型。 此时,两者具有相同的整数类型。 将生成以下输出:
system.int32
system.int32
若要查看 dyn 和 obj 之间的差异,请在前面示例的声明和 writeline 语句之间添加下列两行之间。
复制 dyn = dyn + 3;
obj = obj + 3;
为尝试添加表达式 obj + 3 中的整数和对象报告编译器错误。 但是,不会报告 dyn + 3 错误。 编译时不会检查包含 dyn 的表达式,原因是 dyn 的类型为 dynamic。
于dynamic变量是一个object变量这一点,可以通过il代码得到验证,这里不再贴出il代码。当然,编译器也对dynamic声明进行了处理,以区别直接object变量。
dynamic是做为简化互操作性而被msdn中大肆渲染,我感觉正是基于这一点,才被部分开发人员误解:因为很多开发人员不会接触com+、office二次开发之类的编码,所以急需要一个dynamic的应用理由。那么,在日常开发中,我认为dynamic很有价值的一点是:
于dynamic变量是一个object变量这一点,可以通过il代码得到验证,这里不再贴出il代码。当然,编译器也对dynamic声明进行了处理,以区别直接object变量。
dynamic是做为简化互操作性而被msdn中大肆渲染,我感觉正是基于这一点,才被部分开发人员误解:因为很多开发人员不会接触com+、office二次开发之类的编码,所以急需要一个dynamic的应用理由。那么,在日常开发中,我认为dynamic很有价值的一点是:
于dynamic变量是一个object变量这一点,可以通过il代码得到验证,这里不再贴出il代码。当然,编译器也对dynamic声明进行了处理,以区别直接object变量。 dynamic是做为简化互操作性而被msdn中大肆渲染,我感觉正是基于这一点,才被部分开发人员误解:因为很多开发人员不会接触com+、office二次开发之类的编码,所以急需要一个dynamic的应用理由。那么,在日常开发中,我认为dynamic很有价值的一点是:
dynamic可以简化反射。
以前我们这样使用反射:
public class dynamicsample
{
public string name { get; set; }public int add(int a, int b)
{
return a + b;
}
}
dynamicsample dynamicsample = new dynamicsample(); //create instance为了简化演示,我没有使用反射
var addmethod = typeof(dynamicsample).getmethod("add");
int re = (int)addmethod.invoke(dynamicsample, new object[] { 1, 2 });
现在,我们有了简化的写法:
dynamic dynamicsample2 = new dynamicsample();
int re2 = dynamicsample2.add(1, 2);
我们可能会对这样的简化不以为然,毕竟看起来代码并没有减少多少,但是,如果考虑到效率兼优美两个特性,那么dynamic的优势就显现出来了