写点什么

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:224847
用户头像

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

关注

评论

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

中国首例!「DataKit」上架亚马逊云科技 Marketplace add-ons

观测云

AWS

IPQ8074 vs. IPQ8064 SOC: A Technical Comparison

wifi6-yiyi

cpu wifi SOC

淘宝、1688海外站与外贸站搭建:全面解析与代购系统源码探讨

技术冰糖葫芦

API 安全 API 开发 API 策略 pinduoduo API

SD-WAN远程监控异地组网方案

Ogcloud

SD-WAN 远程监控 企业组网 SD-WAN组网 异地组网

云原生技术实践营 · 深圳站:Serverless + AI 专场开启报名!

阿里巴巴云原生

阿里云 Serverless AI 云原生

解决 JMeter 返回内容中文乱码问题的详细指南

霍格沃兹测试开发学社

技术加持、产品立身“商查利器”爱企查持续助力诚信社会建设

科技热闻

2024青岛国际软件及信息技术博览会(CICE电博会)

AIOTE智博会

软件博览会 软件展会 软件展 软件展览会

淘宝商品详情API接口:商品属性与评论数据综合获取,助力市场研究

技术冰糖葫芦

API 安全 API 开发 API 策略 pinduoduo API

Artstudio Pro for mac(绘图和编辑工具)

Mac相关知识分享

Mac软件 照片编辑软件 数字绘画软件 mac下载

《SelectDB 新一代日志存储分析平台解决方案》白皮书重磅发布|立即下载

SelectDB

大数据 数据分析 实时数仓 解决方案 日志处理

电竞体育直播APP源码开发费用,以及搭建所需的各种资料和服务

软件开发-梦幻运营部

分享一些关于2024下半年AI发展的预测

澳鹏Appen

人工智能 预测 大模型 未来技术趋势 AI趋势

【解决方案】Java 互联网项目中消息通知系统的设计与实现

EquatorCoco

Java 数据库 消息通知

3种方式自动化控制APP

快乐非自愿限量之名

运维 自动化

MES系统适用于哪些行业?MES系统具体功能有哪些?

万界星空科技

mes 万界星空科技 离散型制造业 流程型制造业

FabFilter Total Bundle 2024 for Mac(音频插件合集)

Mac相关知识分享

音频插件 mac插件下载 音乐插件

抑制告警风暴,我们可以做些什么

乘云数字DataBuff

云原生 可观测 告警风暴

网络程序通信的流程

EquatorCoco

php 网络 开发语言

为什么选择SD-WAN进行企业异地组网?

Ogcloud

SD-WAN 企业组网 SD-WAN组网 异地组网 SDWAN

小程序与小组件技术和场景介绍解析

Onegun

小程序 finclip 小程序组件

AI 克隆声音,只需 3 分钟(附最全教程)

阿里巴巴云原生

阿里云 AI 云原生 函数计算

Microsoft Remote Desktop for Mac(微软远程连接软件)

Mac相关知识分享

远程软件 Mac软件 远程桌面 mac下载

京东商品详情API:解锁电商数据的金钥匙

Noah

AR巡点检系统:慧眼智巡,未来视界

AR玩家

AR Rokid Vision pro 炬目AR AR巡点检

构建多模态模型,生成主机观测指标,欢迎来战丨2024天池云原生编程挑战赛

阿里巴巴云原生

阿里云 微服务 云原生

今日分享丨点亮这四个技能,你也可以成为可视化专家

inBuilder低代码平台

设计 设计开发

Allavsoft for Mac(视频下载工具) v3.27.2.8935版

Mac相关知识分享

Mac软件 mac下载 视频下载软件 多媒体下载软件

如何使用JavaScript实现在线Excel附件的上传与下载?

不在线第一只蜗牛

JavaScript Excel

Royal TSX for Mac(强大的远程管理软件)

Mac相关知识分享

服务器管理 mac软件下载 远程管理

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