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

缺点

  • 没有智能提示
  • 允许时报错,还不如编译时报错
  • 重构时,容易遗漏
  • 性能稍微慢一些
posted @   啊哈徐  阅读(466)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示