让我们首先来看看object关键字。我不打算在这方面讲很多,因为它已经自从C#1.0开始只不过是为System.Object准备的一个关键字,这是C#快捷型的层次结构。 (然而,正如埃里克利珀特指出,在他的博客后,并非一切都在C#从对象派生的。)这是一个强有力的机制,因为你几乎可以指定任何值对于此类型的实例。下面是一个简短的例子,它演示的是使用对象关键字的一些好处和问题。
正如您可以看到,虽然objstores是一个整数,编译器不会让你执行没有任何一个参数的数学运算。它可能看起来像铸造帮助你确保你真的有一个整数,但它没有。你可以转换成一个完全不同的类型,编译器将无法检测到它。最终,你得到一个运行时的异常。
所以,你必须执行一个明确的投不能保证任何事情仅仅是因为编译器不会让你运行你的程序没有投。
这里就是在C#4.0中新的动态关键字的用武之地它告诉编译器不执行你的代码后,额外的规则。
这是一间充满活力的主要对象和动态的差异 - 你告诉说,一个对象类型可以是只知道在运行时编译器,编译器不会尝试干涉。因此,你可以写更少的代码。而且我想强调,这是不超过使用原来的对象关键字危险。不过,这不是任何危险性较小,因此,所有的类型检查技术,您需要使用时,如反射物体(经营)必须使用动态对象以及。
接下来的问题是常常会出现像以下内容:“由于一个充满活力的对象可以是任何东西,编译器不检查它是什么,是否意味着你可以通过一个动态反对我不知情的方法/系统,使它崩溃吗?“
假设我们有一个简单的方法。
正如你可以看到,虽然编译器允许你通过一个动态对象,以你的方法,你的方法没有得到这个对象,如果它有一个错误的类型。引发异常的方法之前,实际上是调用。唯一的方法可以传递一个动态对象,以你的方法是,如果它包含在这种情况下,一个字符串的必要价值。
再次,这是没有太大的不同你的行为与对象关键字获得
有人说,这是不难读(int)的obj的,何必与活力呢?那么,在某些情况下当你有这么多投以执行操作,它使你的代码差不多不可读。还有一个简单的情况下,当演员是不够的,你必须调用诸如InvokeMember或GetProperties反射方法。这里是一个很好的例子COM互操作,这就是为什么它被修改为使用新的更多的信息(动态功能,看看这个“如何做”。)
此外,动态关键字和动态语言运行时使许多场景,要么无法或难以做之前,包括动态语言的互操作性。我已经强调了DynamicObject夫妇这种情况早在这个博客:介绍ExpandoObject和创建包装。
您可能还需要看一看的MSDN演练,显示了如何调用一个你可以从C#和IronPython的库Visual Basic和一个非常酷的演示,用动态语言来构建脚本化应用的迪诺Viehland,看看。另一个好演示文稿显示了一些例子,说明了这一功能的设计原则是在C#4动态绑定的马兹托尔热森。
结论是,有没有必要担心有人能打破你的代码使用的动态功能。它不再是(又一次,不小于)对象关键字危险。
所以,如果你经常使用的对象关键字和必须执行的铸造和/或使用反射来调用方法和对象的属性,你也许应该考虑一下这个动态关键字看起来很多。在某些情况下,它的目标和更方便的比用更少的代码编写。