四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2103|回复: 0
打印 上一主题 下一主题

VS2010的新特性:新要害词 - Dynamic  

[复制链接]
  • TA的每日心情
    开心
    2022-6-10 09:59
  • 366

    主题

    741

    帖子

    9649

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    9649
    跳转到指定楼层
    楼主
    发表于 2016-10-28 12:47:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在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对象
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-4-28 13:50 , Processed in 1.062500 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表