C# 4.0: .NET Framework 4 中的新 C# 功能
2010-09-30 22:47:01 来源:WEB开发网在这种情况下,dynamic 更像一个对象,而且这两者之间的相似性不仅局限在这些方面。当编译器发出您的程序集并需要发出 dynamic 变量时,它是通过使用类型对象,然后专门对该对象进行标记,来完成这种操作的。从某种意义上讲,dynamic 是一种对象别名,不过是增加了在您使用它时动态解析操作的额外行为而已。
如果您尝试在两种泛型类型之间进行转换,且这两种类型的唯一差别是 dynamic 和 object,您就会看到这种效果;这样的转换总是能够正确进行的,因为在运行时,List<dynamic> 的实例实际上就是 List<object> 的实例:
List<dynamic> ld = new List<object>();
如果您尝试重写一个在声明时带有 object 参数的方法,也可以了解 dynamic 和 object 之间的相似性:
class C {
public override bool Equals(dynamic obj) {
/* ... */
}
}
尽管它在您的程序集中会解析为修饰的对象,但我确实喜欢将 dynamic 视为真正的类型,因为它可以提醒您:您使用其他任何类型能够执行的大部分操作,也可以使用 dynamic 来执行。您可以将其用作类型参数或返回值。例如,以下函数定义将让您动态使用函数调用的结果,而不需要将其返回值保存到 dynamic 变量中:
public dynamic GetDynamicThing() {
/* ... */ }
对于处理和调度 dynamic 的方式,还有许多细节信息,但是您即使不了解这些信息,也能使用该功能。关键的一点是您可以编写类似于 C# 的代码,如果您编写的代码的任何部分是动态的,编译器就会将其留到运行时处理。
对于动态功能,我要介绍的最后一个主题是:故障。由于编译器无法检查您所使用的动态内容是否真的具有名为 Foo 的方法,因此编译器无法报告错误。当然,这并不意味着 Foo 调用在运行时就能正确执行。它有可能正确执行,但也有很多对象并不具有名为 Foo 的方法。当您的表达式在运行时绑定失败时,绑定器将尽量为您提供一个异常。在一定程度上,这个异常与您未使用 dynamic 作为开头时,编译器提供的异常相似。
- ››功能最全!网管必备子网划分计算工具!
- ››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
更多精彩
赞助商链接