关于c#:翻译c中objectvar与dynamic的区别

31次阅读

共计 1901 个字符,预计需要花费 5 分钟才能阅读完成。

原文链接:
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。代码完满执行,不会报错。

正文完
 0