四联光电智能照明论坛

标题: VS2010的新特性:新要害词 - Dynamic   [打印本页]

作者: gxm771208    时间: 2016-10-28 12:47
标题: VS2010的新特性:新要害词 - Dynamic  
在DotNet 4.0中新增了一个类型:dynamic,它是一个静态类型,但在编译时它会绕过静态类型的检查,它将在程序运行时赋予动态对象时再确认赋予的类型。



下面我们来看一段代码:

public static void Main(string[] args)
        {
            dynamic dyn = 10;  
            dyn = dyn + 10;
            Console.WriteLine(dyn);

dyn = dyn + 10.02;
            Console.WriteLine(dyn);

dyn = "asdfg";
            Console.WriteLine(dyn);
        }

我们来看一下结果:

20

20.02

asdfg

dyn的类型从int到double再到string类型在不断地变化。在编译时dynamic被直接绕过,并没有检查其类型。

来看一下dynamic 同object和var的区别,

object:

public static void Main(string[] args)
        {
            object dyn = 10;  
            dyn = dyn + 10;   //编译时这里会报错误,object不能在int类型之间使用“+”.要执行类型转化后才能执行操作,(int)dyn + 10
            Console.WriteLine(dyn);
        }

var:

public static void Main(string[] args)
        {
            var dyn = 10;  
            dyn = "abc";   //编译时这里会报错误,类型错误。因为在编译时dyn已经被赋予了int类型
            Console.WriteLine(dyn);
        }

dynamic运行时动态的赋予类型,object使用时需要显式转换到你期望的类型,var编译时会反向推断并确认类型。



再看下面一段代码:

public static void Main(string[] args)
        {
            Assembly asm = Assembly.LoadFile("xxxx.dll");
            dynamic dyn = asm.CreateInstance("MyAss.ClassName");
            dyn.Show("dynamic!");
        }

这是dynamic替代反射调用函数,它极大的简化了操作,让我们在编程时更加的轻松愉快^_^。



最后提一下,你可能在以下情况会使用到dynamic:

自动反射

COM组件互操作

混合编程,例如IronRuby和 IronPython

处理Html DOM对象




欢迎光临 四联光电智能照明论坛 (http://5xhome.com/) Powered by Discuz! X3.2