【翻译】c#中object,var与dynamic的区别

杨帆 2020/9/30 16:03:52

原文链接:Difference Between Object and Dynamic Keyword in C#Difference between var and dynamic in C#篇一(dynamic与object的区别)我们经常看到很多C#开发者并不能区分object与dynamic变量。我最近也尝试在网上找相关的教程和文章,不过还是没有找到比较好的解释…

原文链接:
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,编译器所给的提示信息较少。它不是编译器安全的。
例子:
image
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;
image
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这样的动态语言。

##### 对照表

vardynamic
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。代码完美执行,不会报错。
随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[【翻译】c#中object,var与dynamic的区别]http://www.zyiz.net/tech/detail-147663.html

上一篇:手把手教你ASP.NET Core:创建 Web API

下一篇:C# 中的 is 真的是越来越强大,越来越语义化

赞(0)

共有 条评论 网友评论

验证码: 看不清楚?
    关注微信小程序
    程序员编程王-随时随地学编程

    扫描二维码或查找【程序员编程王】

    可以随时随地学编程啦!

    技术文章导航 更多>
    扫一扫关注最新编程教程