基于Visual Studio2010与C 4 0新功能和展望-- dynamic 和 object 之间的关键区别

               

让我们首先来看看object关键字。我不打算在这方面讲很多,因为它已经自从C#1.0开始只不过是为System.Object准备的一个关键字,这是C#快捷型的层次结构。 (然而,正如埃里克利珀特指出,在他的博客后,并非一切都在C#从对象派生的。)这是一个强有力的机制,因为你几乎可以指定任何值对于此类型的实例。下面是一个简短的例子,它演示的是使用对象关键字的一些好处和问题。

object obj = 10;Console.WriteLine(obj.GetType());// Prints System.Int32 because // this is the type of the value stored in this object.// A compiler error, because // at compile time the type of obj is System.Object.// obj = obj + 10; // You need to explicitly cast obj to a necessary type.obj = (int)obj + 10;// However, this does not mean that you are really safe. // You can cast to a wrong type // and the compiler will not detect it. // Here you get an exception at run time, // because obj is an integer, not a string.// obj = (string)obj + 10;// You also get a run-time exception // if you cast to a wrong numeric type, // even if there is an implicit conversion in the language.// obj = (double)obj + 10;

正如您可以看到,虽然objstores是一个整数,编译器不会让你执行没有任何一个参数的数学运算。它可能看起来像铸造帮助你确保你真的有一个整数,但它没有。你可以转换成一个完全不同的类型,编译器将无法检测到它。最终,你得到一个运行时的异常。

所以,你必须执行一个明确的投不能保证任何事情仅仅是因为编译器不会让你运行你的程序没有投。

 

这里就是在C#4.0中新的动态关键字的用武之地它告诉编译器不执行你的代码后,额外的规则。 

dynamic dyn = 10;Console.WriteLine(dyn.GetType());// Same as "object". // Prints System.Int32 because // this is the type of the value stored in this object.// No compiler error, because // the compiler does not try to identify // the type of the dynamic object at compile time.dyn = dyn + 10;// Also, this operation will succeed for all numeric // or other types that support a “+” operation.dyn = 10.0;dyn = dyn + 10;dyn = "10";dyn = dyn + 10;

这是一间充满活力的主要对象和动态的差异 - 你告诉说,一个对象类型可以是只知道在运行时编译器,编译器不会尝试干涉。因此,你可以写更少的代码。而且我想强调,这是不超过使用原来的对象关键字危险。不过,这不是任何危险性较小,因此,所有的类型检查技术,您需要使用时,如反射物体(经营)必须使用动态对象以及。

接下来的问题是常常会出现像以下内容:“由于一个充满活力的对象可以是任何东西,编译器不检查它是什么,是否意味着你可以通过一个动态反对我不知情的方法/系统,使它崩溃吗?“

假设我们有一个简单的方法。

public static void Print(string arg){    Console.WriteLine(arg);}Now let’s look at how you can pass a dynamic object to it.dynamic dyn = 10;// You get an exception at run time here.Print(dyn);

正如你可以看到,虽然编译器允许你通过一个动态对象,以你的方法,你的方法没有得到这个对象,如果它有一个错误的类型。引发异常的方法之前,实际上是调用。唯一的方法可以传递一个动态对象,以你的方法是,如果它包含在这种情况下,一个字符串的必要价值。

dynamic dyn = "10";Print(dyn);

再次,这是没有太大的不同你的行为与对象关键字获得

object obj = 10;// Doesn't compile.//Print(obj);// Compiles, but there is an exception at run time.//Print((string)obj);// This code works because obj is now a string, // but you still need a cast.obj = "10";Print((string)obj);

有人说,这是不难读(int)的obj的,何必与活力呢?那么,在某些情况下当你有这么多投以执行操作,它使你的代码差不多不可读。还有一个简单的情况下,当演员是不够的,你必须调用诸如InvokeMember或GetProperties反射方法。这里是一个很好的例子COM互操作,这就是为什么它被修改为使用新的更多的信息(动态功能,看看这个“如何做”。)

此外,动态关键字和动态语言运行时使许多场景,要么无法或难以做之前,包括动态语言的互操作性。我已经强调了DynamicObject夫妇这种情况早在这个博客:介绍ExpandoObject和创建包装。

您可能还需要看一看的MSDN演练,显示了如何调用一个你可以从C#和IronPython的库Visual Basic和一个非常酷的演示,用动态语言来构建脚本化应用的迪诺Viehland,看看。另一个好演示文稿显示了一些例子,说明了这一功能的设计原则是在C#4动态绑定的马兹托尔热森。

结论是,有没有必要担心有人能打破你的代码使用的动态功能。它不再是(又一次,不小于)对象关键字危险。

所以,如果你经常使用的对象关键字和必须执行的铸造和/或使用反射来调用方法和对象的属性,你也许应该考虑一下这个动态关键字看起来很多。在某些情况下,它的目标和更方便的比用更少的代码编写。

 

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值