C# 4 中的 Expando 对象
2010-09-30 22:46:55 来源:WEB开发网核心提示:大多数为 Microsoft .NET Framework 编写的代码都是基于静态类型化的,尽管 .NET 通过反射支持动态类型化,C# 4 中的 Expando 对象,此外,如同 Visual Basic 一样,动态类型化把所有的类型检查都推迟到了运行时进行,您编写代码时使用的接口仍然是固定不变的,JScript 1
大多数为 Microsoft .NET Framework 编写的代码都是基于静态类型化的,尽管 .NET 通过反射支持动态类型化。此外,如同 Visual Basic 一样,JScript 10 年前也在 .NET 基础上拥有一个动态类型系统。静态类型化意味着每个表达式都属于一个已知的类型。类型和赋值在编译时均经过验证,因此大多数可能的类型化错误都会被提前发现。
有一个众所周知的例外,那就是当您尝试在运行时执行类型转换时,如果源类型与目标类型不兼容,有时可能会导致动态错误。
静态类型化性能良好、清晰明了,但这是建立在您事先对您的代码(和数据)近乎完全了解这样的假设之上的。现在,大家强烈希望能够将这个限制放宽一点。超越静态类型化通常意味着面临三种截然不同的选择:动态类型化、动态对象以及间接或基于反射的编程。
在 .NET 编程中,从 .NET Framework 1.0 开始就具备了反射功能,并且已经广泛应用以推动特殊框架的发展,例如控制反转 (IoC) 容器。这些框架用于解决运行时的类型依赖关系,从而使您的代码能够直接使用接口,而无需了解对象之后的具体类型及其实际行为。使用 .NET 反射,您能够实现各种间接编程,以便您的代码能够与中间对象进行通信,然后由后者调度对固定接口的调用。您可以通过字符串的形式传递要调用的成员名称,从而使您具有能够从某些外部源读取该名称的灵活性。目标对象的接口是固定不变的 - 在您通过反射执行的任何调用后面,总是会有一个众所周知的接口。
动态类型化意味着您编译的代码将会忽略可以在编译时检测到的静态类型结构。实际上,动态类型化把所有的类型检查都推迟到了运行时进行。您编写代码时使用的接口仍然是固定不变的,但是您使用的值在不同的时刻可能会返回不同的接口。
[]
赞助商链接