C# 4.0: .NET Framework 4 中的新 C# 功能
2010-09-30 22:47:01 来源:WEB开发网事实上,该代码会输出:
Method: Bar
Argument: Baz
Argument: 3
Argument: MyDynamicObject
通过将 d 声明为类型 dynamic,使用 MyDynamicObject 实例的代码就能有效地取消对 d 参与的操作进行的编译时检查。使用 dynamic,即表示“我不知道此变量会是什么类型的,因此我不知道它现在有哪些方法或属性。编译器,请让它们通过编译,留待运行时真正存在对象时再做判断。”因此即使编译器不知道 Bar 调用是什么意思,也能正确编译该调用。随后,在运行时,将由该对象本身来决定 Bar 调用将执行什么操作。这就是 TryInvokeMember 所知道的处理方式。
现在,假设您使用一个 Python 对象来代替 MyDynamicObject:
dynamic d = GetPythonObject();
d.bar("Baz", 3, d);
如果该对象是下面列出的文件,则该代码也能正确执行,并且输出几乎完全一样:
def bar(*args):
print "Method:", bar.__name__
for x in args:
print "Argument:", x
实际上,每次使用 dynamic 值时,编译器都会生成一些代码,用来初始化和使用 DLR CallSite。该 CallSite 包含在运行时进行绑定所需的全部信息,包括方法名称、额外数据(例如是否在已检验上下文中执行操作)以及有关参数及其类型的信息。
如果您必须维护此代码,则此代码完全像上面所示的反射代码、ScriptObject 代码或包含 XML 查询的代码一样丑陋。这是 C# 中动态功能的要求,但您没必要像这样编写代码!
在使用 dynamic 关键字时,您的代码完全可以像您所期望的那样:像简单的方法调用、索引器调用、运算符(例如 +)、类型转换甚至复合运算符(例如 += 或 ++)。您甚至可以在语句中使用 dynamic 值,例如 if(d) 和 foreach(var x in d)。还可以通过 d && ShortCircuited 或 d ??ShortCircuited 等代码支持短路。
- ››功能最全!网管必备子网划分计算工具!
- ››Netpas加速 让非电信宽带用户流畅上网
- ››net中fckediter的图片上传时候点击\浏览服务器\出...
- ››Netmsg局域网聊天程序
- ››NetAirus指控苹果iPhone侵犯其专利
- ››Netflix 在线影视播放程序将登陆 iPhone
- ››Net中各种不同的对象创建方式的速度差异
- ››NetNewsWire 功能简单 界面快速 Reader 浏览器
- ››功能完整的 Google Reader 离线浏览器 Byline 介绍...
- ››NET-使用Js调用WebService
- ››Net 应用程序如何在32位操作系统下申请超过2G的内...
- ››NET 4.0新特性-- Corrupted State Exceptions
更多精彩
赞助商链接