zoukankan      html  css  js  c++  java
  • 关于dynamic类型

    动态类型是从C#4才开始有的,随着DLR一起引人的。
    大部分时候的行为如同object类型,对应的IL代码也是object类型。
    它的特点是编译时会忽略在dynamic上进行的操作,如调用方法,读写属性等;
    运行时才会转成确定的对象;还可以和Python等动态语言交互。这就是它的优势;

    dynamic和var的区别

    • var 不能用作方法的输入和返回值类型,而dynamic可以(但不能作为扩展方法的参数)
    • var 不能修饰类/结构的成员,dynamic可以
    • var 修饰的类型,在编译时就确定了; 而且一旦确定就不能变更了,而dynamic可以变更;如 dynamic d= 1; d="a"; 是可以正常运行的.

    动态类型的限制

    • 动态类型没有构造函数 dynamic d = new dynamic();是错误的 ,正确的是 dynamic d2 = new ExpandoObject();
    • 不能作为接口的一部分, 如 class A :IEnumerable<dynamic>是错误的
    • 不能作为泛型约束的一部分
    • 不能作为基类
    • 不能作为lambda表达式的变量类型 ,必须强制指定类型
    //错误
    dynamic d=(x=>x+1);
    //正确
    dynamic d=(Func<int,int>)(x=>x+1);
    
    • 不能做扩展方法的参数
    var nums= Enamerable.Range(0,10);
    dynamic d=4;
    //错误
    nums.Take(d);
    
    优势
    • 和反射相比
      如果一个确定的类型被转成了 object类型, 我们需要反射获取到方法,然后 method.Invoke(instance,null);
      而动态类型可以直接 , obj.Method();
      dynamic的可读性更高,代码更少 ,当方法需要传递参数时,就更明显了

    • 简化了和 COM互操作
      如果将COM互操作的类型 内嵌到程序集,则很多类型会自动转成 dynamic

    • 和泛型相比
      比泛型更灵活 ; 由于泛型没法添加 操作符重载约束,使用dynamic作为方法参数,可以解决这个问题。

    缺点

    • 没有智能提示
    • 允许时报错,还不如编译时报错
    • 重构时,容易遗漏
    • 性能稍微慢一些
  • 相关阅读:
    JavaScript是单线程的
    JavaScript异步
    对象和文本间的转换
    json注意事项
    什么是 JSON?
    定义 Teacher() 构造器函数
    给每一个缩略图添加点击处理器
    新的事件触发机制被定义在 Document Object Model (DOM) Level 2 Events Specification,
    事件在浏览器窗口中
    在代码中做决定 — 条件在任何程序语言中
  • 原文地址:https://www.cnblogs.com/francisXu/p/13717036.html
Copyright © 2011-2022 走看看