50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

C#动态特性的更多消息

  • 2009-04-30
  • 本文字数:1245 字

    阅读完需:约 4 分钟

Mads Torgersen 给大家展示了 C#中 dynamic 关键字的更多详细信息,以及它的一些具体用法。并谈及在选用 dynamic 关键字之前,一些最终被废弃的替代设计方案。

C# 4 将通过新的元类型“dynamic”来添加对后期绑定的支持。任何直接声明为这种类型的变量,或者从函数中返回这种类型的值,都将自动地视为后期绑定。这类似于在 Visual Basic 中把变量声明为“object”,不过它现在可以支持任何类型系统了,不仅仅是 CTS(通用类型规范)和 COM。

一个重要之处是,这个特性的目标就是为了支持后期绑定,以及更多地为了支持近来流行的动态绑定。动态类型明显不是 C#的一个特性【译者注:意指 C#是静态语言,本来无需动态类型的】,不过是为了支持动态绑定的一个后果。

还要着重注意的一点是,反射并不是一种很好的替代方案。使用反射的问题在于,需要处理各种各样的类型。使用 Reflection 命名空间调用方法的方式和在 ScriptObject 上调用方法的方式并不相同。尤其,Ruby/Python 方法这样的第三方方法。

一种选择是用波形号作为动态操作的前缀。可惜,这种方式马上也变得难以使用,尤其在你开始研究类型转换、数组索引和数学操作符的地方:

复制代码
object d = GetDynamicObject(); string result = ~(string) d ~[ d~.Length ~- 1];

下一个曾考虑过的选择是动态上下文。类似 unsafe 和 unchecked 上下文那样,你能够标注任意的代码块为“dynamic”。这种方式的问题在于,它很难把静态和动态代码混合在一起。这种方式书写的代码类似下面:

复制代码
dynamic {
//some dynamic code
static {
//some statically bound code
dynamic {
//some dynamic code in some static code
}
//some more statically bound code
}
//some more dynamic code
}

第三种方案是传播性的表达式。由于表达式的动态本质将产生向上传播的问题。

复制代码
object d = GetDynamicObject();
string result = (string) d[ dynamic(d).Length - 1];

当然,它们选择的语法也不够完美。虽然可以让大家轻易地读懂代码,但是没有任何东西来表明一个动态调用是在实际 Call Site 当中被创建出来的。唯一看到的信息是这个变量在哪里声明的。

复制代码
dynamic d = GetDynamicObject();
string result = (string) d[d.Length - 1];

选用这种设计的关键原因是,代码未必真的不够安全。进行动态调用本身就像之前抛出异常那样,不过现在你不用编写所有臃肿、易出错的反射逻辑了。

另外一个曾考虑过的选择是用 dynamic 修饰符来代替元类型。使用这种模式的代码如下所示,开发人员能够早期绑定到 Foo 的方法上,而不是在任何东西上进行后期绑定。虽然这样可以在一些边界情况下提高性能,不过它却增加了总体的复杂等级,这样的复杂度是难以接受的。

复制代码
dynamic Foo d = GetDynamicFooObject();

每逢动态组件进入到表达式中,整个表达式将可能成为动态的。这包括:

  • 方法调用
  • 程序调用
  • 成员访问
  • 操作符运用
  • 索引访问

例外是相当显而易见的,转换和构造器将返回给你静态上下文。虽然转换能被 DLR 类型系统所重写,但是 DLR 会把转换的结果指定为适当的类型。

查看英文原文: More on Dynamic Support in C#

2009-04-30 22:225195
用户头像

发布了 254 篇内容, 共 69.3 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

回顾与展望Zebec举办的“Web3.0 TechHive Summit 2022 大会”

鳄鱼视界

【web 开发基础】PHP面向对象之访问类中的成员属性和方法(58)

迷彩

面向对象 this指针 PHP基础 PHP8 实例化

大势所趋_ 华为云企业交换机ESW助力智慧医院转型

路过的憨憨

什么是WebSocket

穿过生命散发芬芳

websocket 12月月更

2022年度盘点|聚焦运维服务,云智慧的高光时刻

云智慧AIOps社区

运维 AIOPS 智能运维 云智慧 智能运维AIOps

华为云VPN,经典跟专业版企业应该怎么选?

清欢科技

【web 开发基础】PHP8中对数组操作的新变化(56)

迷彩

List 数组 字符串 PHP基础 PHP8

WIKO+鸿蒙生态:海外品牌中国化的新范式

脑极体

如何实现线上线下良好互通?华为云CC支持一点接入多点通达

爱科技的水月

Zebec的“Web3.0 TechHive Summit 2022 大会”圆满落幕,回顾与展望

股市老人

Github星标80k的阿里大牛强推JDK源码笔记,6到飞起

程序知音

Java 源码 jdk 后端技术

华为虚拟专用网络VPN,为何备受游戏厂商喜爱?

清欢科技

Kafka的灵魂伴侣Logi-KafkaManger(2)之kafka针对Topic粒度的配额管理(限流)

石臻臻的杂货铺

kafka 后端

华为云企业交换机ESW,让数据业务无缝迁移上云

路过的憨憨

安全可靠,弹性灵活--华为虚拟专用网络VPN

清欢科技

GitHub屠榜第一的微服务架构深度解析,简直太硬核了

小小怪下士

Java 程序员 微服务

【web 开发基础】PHP8 中类的基本操作(57)

迷彩

面向对象 PHP基础 PHP8 实例化

8年java技术岗面试官总结:2022超强面试大全,抓住2022的小尾巴

钟奕礼

程序员 Java 面试 Java、 java 编程

华为云弹性负载均衡服务,如何助企业应付流量压力

爱科技的水月

无代码的未来

俞凡

无代码

更加灵活、稳定,华为云虚拟专用网络VPN双活网关优势明显!

清欢科技

公共网络安全,还得看华为云虚拟专用网络VPN

清欢科技

史上最全JVM大全详解!java程序员细节到极致的一次,魔鬼

钟奕礼

程序员 Java 面试 Java、 java 编程

华为云连接CC服务助企业联通全球

爱科技的水月

从各行业的实际运用中,窥见华为云虚拟专用网络VPN的强大性能

清欢科技

让上云变成一件简单的事情!华为云企业交换机支持无缝迁移上云

路过的憨憨

华为云弹性负载均衡ELB,如何保障服务器不瘫痪?

爱科技的水月

5分钟搞懂Web3架构

俞凡

架构 web3

【kubernetes入门到精通】Kubernetes的健康监测机制以及常见ExitCode问题分析「探索篇」

码界西柚

Kubernetes 云原生 服务监控 12月月更

如何为企业打造优质应用环境!华为云弹性服务器了解一下

路过的憨憨

C#动态特性的更多消息_.NET_Jonathan Allen_InfoQ精选文章