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作为方法参数,可以解决这个问题。

    缺点

    • 没有智能提示
    • 允许时报错,还不如编译时报错
    • 重构时,容易遗漏
    • 性能稍微慢一些
  • 相关阅读:
    React在componentDidMount里面发送请求
    React 术语词汇表
    React里受控与非受控组件
    React和Vue等框架什么时候操作DOM
    【LeetCode】79. Word Search
    【LeetCode】91. Decode Ways
    【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)
    【LeetCode】1. Two Sum
    【LeetCode】141. Linked List Cycle (2 solutions)
    【LeetCode】120. Triangle (3 solutions)
  • 原文地址:https://www.cnblogs.com/francisXu/p/13717036.html
Copyright © 2011-2022 走看看