写点什么

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

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

关注

评论

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

3.1 Go语言从入门到精通:包

xcbeyond

3月日更 Go 语言

2021最新分享字节四面成功拿Offer!

比伯

Java 编程 架构 面试 计算机

由浅入深了解Nirvana NAC公链的两面性NA公链

区块链第一资讯

区块链 公链 挖矿

Java面试必问:一位清华大牛用一个坦克大战讲明白了23种设计模式(视频+源码笔记)

Java架构追梦

Java 架构 面试 设计模式 坦克大战

《经济学人》2021年3月27日刊精彩文章导读及资源免费下载

wbliu85

Golang :后端开发中的万能药吗?

华为云开发者联盟

后端 开发 分布式系统 Go 语言

Ai调参炼丹,一篇就够了

泳鱼

Python 机器学习 深度学习 AI

马特系统开发流程丨马特量化机器人系统开发案例

系统开发咨询1357O98O718

如何阅读 Java 字节码(Byte Code)

Kori Lin

Java JVM bytecode 字节码

实例讲解如何制作Python模式程序

华为云开发者联盟

Python 编程语言 星型程序 Programs 模式程序

深入理解 JavaScript, 从作用域与作用域链开始

koala

JavaScript 大前端

Apache Ranger安全认证配置

大数据技术指南

大数据 3月日更

Photoshop CC 2019 の 安装

空城机

PhotoShop ps p图 adobe

4大华为云“安全镖局”秘密法宝揭秘

华为云开发者联盟

态势感知 华为云 企业主机安全 数据安全中心 Web应用防火墙

Google Material Design 元件库

zhuchuanming

元件库

【JS必知必会】高阶函数详解与实战

koala

JavaScript 面试 大前端

软件工程笔记:什么是软件工程

风翱

软件工程 3月日更

简单数据结构总结

我是程序员小贱

3月日更

Spark性能调优-Shuffle调优及故障排除篇

五分钟学大数据

spark Spark调优 3月日更

领域驱动设计101 - 绑定模型与实现

luojiahu

领域驱动设计 DDD

一束光的旅程

白洞计划

ARTS-Week-1

绝影

ARTS 打卡计划 ARTS活动

火币矿池pro系统开发介绍案例丨火币矿池pro源码功能

系统开发咨询1357O98O718

EGG NETWORK永动金融EFTalk火爆来袭

币圈那点事

经常被面试官问道的JavaScript数据类型知识你真的懂吗?

koala

JavaScript 面试 大前端

Ai特征选择,一篇就够了

泳鱼

Python 人工智能 机器学习 深度学习 AI

一文归纳Python特征生成方法(全)

泳鱼

Python 机器学习 深度学习

阿里P7大牛手把手教你!美团Android开发工程师岗位职能要求,附赠课程+题库

欢喜学安卓

android 程序员 面试 移动开发

MySQL-MVCC与锁机制

insight

3月日更

HUBDEX交易所系统开发源码案例

系统开发咨询1357O98O718

Android开发必须要会!2021大厂Android面试经验,全网疯传

欢喜学安卓

android 程序员 面试 移动开发

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