C#中Dynamic与Variant的区别:Dynamic是否打破静态类型规则?
C#
dynamic 与 JavaScript/VBA 中 Variant 的核心区别 首先明确结论:dynamic 并没有打破C#的静态类型本质,和其他语言里的Variant核心差异主要有三点:
- 类型检查逻辑完全不同
像JS、VBA里的Variant是纯动态类型的产物,编译阶段完全不做任何类型校验,你调用不存在的方法、访问不存在的属性,只有代码真正运行到这一行的时候才会报错。而C#的dynamic只是把类型检查的时机从编译期延后到了第一次运行到这段代码的时刻,校验规则还是严格遵循C#的静态类型系统,不会像动态语言那样做大量隐式类型兼容。 - 变量的类型约束不同
Variant类型的变量本身没有任何类型限制,你可以给同一个变量先后赋值数字、字符串、对象、函数,完全没有约束。而dynamic本质上还是.NET体系下的类型,所有dynamic变量底层都是System.Object的派生,运行时每个值都有明确的静态类型,动态调用的时候还是会按照静态类型的签名去匹配方法,匹配失败直接抛异常。 - 调用性能表现不同
传统Variant的动态调用每次都要重新做类型判断、方法查找,性能损耗固定且很高。而C#的dynamic调用在第一次完成类型绑定后会缓存绑定结果,后续再执行同一段代码时不需要重复做类型校验,性能比Variant的动态调用高很多。
之前提到的「C#是静态类型语言,不存在variant类型的使用空间」这个表述是完全成立的,dynamic只是在静态类型框架上扩展了动态分发的能力,并没有引入完整的动态类型体系,和Variant本质上不是一回事。
内容的提问来源于stack exchange,提问作者Anthony Griggs
相关产品推荐
相关产品推荐

