c#中object、var和dynamic的区别小结

 更新时间:2020年12月8日 11:35  点击:1966

原文链接:

Difference Between Object and Dynamic Keyword in C#

Difference between var and dynamic in C#

篇一(dynamic与object的区别)

我们经常看到很多C#开发者并不能区分object与dynamic变量。我最近也尝试在网上找相关的教程和文章,不过还是没有找到比较好的解释。这篇文章将梳理object与dynamic区别的关键点。

总的来说,dynamic与object都不进行编译时类型检查(compile-time type checks),只有在运行时才会对变量类型进行检查,同时,dynamic和object修饰的变量都能存储任意数据类型。object是C# 1.0引入的,而dynamic是C# 4.0引入的。稍后我会讲一下为什么要引入dynamic。(明明object已经存在了,为什么还要引入dynamic?)

下面一些要点解释了两者的主要区别

区别一

Object: 对于object,编译器所给的提示信息较少。它不是编译器安全的。

例子:

ps: 你在对object取值/赋值时,每次都必须要显式转换为自己想要的数据类型。

object a = "Rohatash Kumar";

string a1 = a.ToString();

Dynamic: 编译器不显示任何提示信息。

用法:

dynamic a = "Rohatash Kumar";

string a1 = a;

区别二

Object: C# 1.0引入

Dynamic: C# 4.0引入

区别三

Object: 在使用object时,你必须将object转换为原始数据类型才能进行预期操作。正如区别一所示,下面是错误示范:

object a = "Rohatash Kumar";
string a1 = a;

因此你必须每次都要进行显式转换

Dynamic: 不需要进行显示转换,但需要知道它内部的属性和方法。(但在点操作的时候,编译器不会提示)

区别四

Object: 如果此前没有转换为合适的数据类型(即错误的类型转换),编译器会在运行时抛出错误。即编译的时候不会报错,而在运行(调用)的时候就会报错。

例子

String a = "Rohatash Kumar";
object a1 = a;
int b = (int)a1;

ps:上面的a为string类型;a1为object类型,保存着a的副本。因此不能将a1显示转换为int类型。

Dynamic: dynamic不会报错,因为编译器保存着dynamic变量的所有信息。

dynamic与object总结:

Object 在我们不知道数据类型时很有用。 Dynamic 更多是用在反射,支持动态语言,COM对象调用以及获取LINQ的查询结果。

篇二(var与dynamic的区别)

var是C# 3.0引入的(基于 .NET 3.5),dynamic是C# 4.0。

var声明的变量都是静态类型,dynamic是动态类型。dynamic的引入是为了支持像ruby,python这样的动态语言。

##### 对照表

var dynamic
C# 3.0引入 C# 4.0引入
静态类型 – 在编译的时候就确定了类型 动态类型 – 在运行时才确定变量类型
需要 在定义时完成初始化。 例如: var str="I am a string"; str这个变量会被编译器当作string类型。 不 需要 在定义时初始化。 例如,以下代码没有任何问题: dynamic str; str="I am a string"; str=2;
编译时捕获错误 因为编译器在编译的时候就知道了它的属性,类型和方法。 运行时才会捕获错误 因为编译器在运行的时候才知道其属性,类型及方法。
Visual Studio会显示补全提示(intellisense) 因为对于编译器而言,变量的类型是确定的/知道的。 没有智能提示 因为只有运行时才能知道其类型,属性及方法。
例如, var obj1;将 抛出编译错误 因为变量没有被初始化,而编译器在编译时需要根据它的值推断出类型。 而 dynamic obj1;则编译成功
如, var obj1=1;编译没有问题,而再加上下面这句 var obj1=” I am a string”; 就会报错 因为obj1的数据类型已经在第一句赋值时就确定了,也就是System.Int32(数字1所对应的数据类型) 而第二句把string类型的值赋给Int32自然就违反类型安全了。(一般而言,不同类型不能直接赋值) 又如, dynamic obj1=1;没有问题,再加上dynamic obj1=" I am a string";还是没有问题 因为编译器首先将obj1指定为Int32类型(运行时指定),在第二句调用时又将obj1重新指定为string。代码完美执行,不会报错。

总结

到此这篇关于c#中object、var和dynamic区别的文章就介绍到这了,更多相关c#中object、var和dynamic区别内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • VBS中FileSystemObject对象详解(完整版)

    今天在脚本之家看了几篇关于vbs FileSystemObject的一些资料,发现不够详细与完整这里刚好发现了一篇更好的文章特整理一下,需要的朋友可以参考下...2020-06-30
  • js如何打印object对象

    js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下: fu...2015-10-21
  • java中JSONObject转换为HashMap(方法+main方法调用实例)

    这篇文章主要介绍了java中JSONObject转换为HashMap(方法+main方法调用实例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-14
  • 解决vue props传Array/Object类型值,子组件报错的情况

    这篇文章主要介绍了解决vue props传Array/Object类型值,子组件报错的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-07
  • JavaScript类型系统之Object详解

    对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并为其添加属性和(或)方法,就可以创建自定义对象...2016-01-08
  • 详解Javascript中的Object对象

    这篇文章主要介绍了详解Javascript中的Object对象,需要的朋友可以参考下...2016-03-01
  • C#中var关键字用法分析

    这篇文章主要介绍了C#中var关键字用法,实例分析了C#中var关键字的应用场合,对于.NET的学习具有一定参考价值,需要的朋友可以参考下...2020-06-25
  • C#中 dynamic、Object和var之间的实际区别是什么?何时使用它们?

    dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能。 什么是动态编程语言有时可以划分为静态类型化语言和动态类型化语言。C#和Java经常被认为是静...2020-05-11
  • 深入理解JavaScript中的对象复制(Object Clone)

    下面小编就为大家带来一篇深入理解JavaScript中的对象复制(Object Clone)。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-05-20
  • c# 所有类型都从Object类型派生

    所有的类型最终从object派生,每一个类型都有一组最基本的方法...2020-06-25
  • C#中Dynamic和Dictionary性能比较

    开发中需要传递变参,考虑使用 dynamic 还是 Dictionary,dynamic 的编码体验显著优于 Dictionary,如果性能差距不大的话,我会选择使用dynamic。下面通过本文给大家详细介绍下C#中Dynamic和Dictionary性能比较,一起看看吧...2020-06-25
  • 浅析C# Dynamic关键字

    这篇文章主要介绍了C# Dynamic关键字的相关资料,文中讲解非常细致,对大家学习C# Dynamic关键字有所帮助,感兴趣的朋友可以了解下...2020-11-03
  • C#实现xml文件反序列化读入数据到object的方法

    这篇文章主要介绍了C#实现xml文件反序列化读入数据到object的方法,涉及C#操作XML文件类型转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Delphi中使用ISuperObject解析Json数据的实现代码

    这篇文章主要介绍了Delphi中使用ISuperObject解析Json数据的实现代码,需要的朋友可以参考下...2020-06-30
  • c#中var关键字用法浅谈

    这篇文章介绍了c#中var关键字用法,有需要的朋友可以参考一下...2020-06-25
  • C# 反射与dynamic最佳组合示例代码

    这篇文章主要介绍了C# 反射与dynamic最佳组合示例代码,需要的朋友可以参考下...2020-06-25
  • 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

    随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。下面通过本文给大家分享C# 匿名对象(匿名类型)、var、动态类型 dynamic,需要的的朋友参考下吧...2020-06-25
  • C#探秘系列(四)——GetHashCode,ExpandoObject

    这篇继续分享下GetHashCode和ExpandoObject这两个比较好玩的方法。...2020-06-25
  • C++JSON库CJsonObject详解(轻量简单好用)

    CJsonObject是基于cJSON全新开发一个C++版的JSON库,CJsonObject的最大优势是轻量简单好用,开发效率极高,对多层嵌套json的读取和生成使用非常简单,喜欢的朋友一起看看吧...2021-04-27
  • swift中AnyObject和Any的介绍与区别详解

    虽然使用swift开发了一段时间,但是感觉对一些基础的东西了解不是比较透彻,在查询了许多资料以后还是打算自己动手记录一下,下面这篇文章主要给大家介绍了关于swift中AnyObject和Any的介绍与区别的相关资料,需要的朋友可以参考下。...2020-06-30