关于dynamic类型
2024-10-21 03:04:15
动态类型是从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作为方法参数,可以解决这个问题。
缺点
- 没有智能提示
- 允许时报错,还不如编译时报错
- 重构时,容易遗漏
- 性能稍微慢一些
最新文章
- Windows操作系统优化(Win7版) - 进阶者系列 - 学习者系列文章
- hdu 5073
- [知识整理]Java集合(二) - Set
- java基础 数组15
- iOS多线程-01-pthread与NSTread
- J2EE 第二阶段项目(八)
- 【转载】Oracle的方案(Schema)和用户(User)的区别
- 项目经验之:MVVM初学者图形化笔记整理。。。
- .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二)
- jQuery 的属性操作方法
- 解锁Scott过程中出现的问题及解决办法
- 技术小白:Hadoop 到底是啥?
- UpdatePanel和jQuery不兼容
- UVa 353 - Pesky Palindromes
- flask蓝图的使用
- Struts2自定义拦截器Interceptor以及拦截器登录实例
- hdu3065 ac自动机
- mybatisplus打印sql语句
- docker基础之镜像
- 【题解】JSOIWC2019 Round2
热门文章
- 【微服务架构设计实施】第一部分:架构篇-1:微服务架构与Spring Cloud介绍
- 有来实验室|第一篇:Seata1.5.2版本部署和开源全栈商城订单支付业务实战
- 上传文件到阿里云 oss,前端 browser.js 笔记
- PHP-表单传值
- Linux 下的输入输出和重定向示例
- Oracle或者Mysql误删表之后的恢复办法
- LCA学习笔记(原洛谷文章)
- Java集合 - ConcurrentHashMap
- 03-Sed基础语法及例子
- ionic+vue+capacitor系列笔记--02项目中集成Capacitor,添加android,ios平台,真机运行项目