原文链接:
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区别内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍C#中var和dynamic之间的区别,包括了C#中var和dynamic之间的区别的使用技巧和注意事项,需要的朋友参考一下 我们知道,任何语言的编程都以声明变量开始,然后对其进行定义和逻辑实现。因此,最重要的因素之一就是知道在开始用任何编程语言声明变量之前如何对其进行编码。 现在,如果我们使用C#语言的实例,则变量的声明会随着语言的发展而变化。与以前的C#版本一样,所有编写的代码都
本文向大家介绍Dynamic和Var的区别及dynamic使用详解,包括了Dynamic和Var的区别及dynamic使用详解的使用技巧和注意事项,需要的朋友参考一下 C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的。var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的值,而dynamic则可以不提供,它
问题内容: 在编程中,尤其是在Java中,两者之间有什么区别? 和 这会对for循环产生什么影响? 例如 问题答案: tldr; 尽管和都会使它们所应用的变量递增,但是by 所返回的结果是递增之前的变量值,而by 所返回的结果就是应用递增之后的变量值。 进一步说明 当或形成完整的语句时(如您的示例),两者之间没有区别。例如以下 等同于 但是,当或用作较大语句的一部分时,两者可能不相等。例如,以下断
本文向大家介绍@synthesize @dynamic 的区别相关面试题,主要包含被问及@synthesize @dynamic 的区别时的应答技巧和注意事项,需要的朋友参考一下 @synthesize 是系统自动生成getter和setter属性声明 @dynamic 是开发者自已提供相应的属性声明 @dynamic 意思是由开发人员提供相应的代码:对于只读属性需要提供 setter,对于读写属
问题内容: 嗨,我想知道上述比较之间的区别吗? 我在检查时得到空指针异常。但是,如果我将其更改为,则效果很好。 问题答案: 和之间的区别 没有语义上的差异。 和 等价。 也许您将其与以下事实混淆了: 和 可以有所作为(因为第二种选择可能会导致NPE(如果被叫人为空)。
本文向大家介绍C# 中 &和&&的区别相关面试题,主要包含被问及C# 中 &和&&的区别时的应答技巧和注意事项,需要的朋友参考一下 答: &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).
问题内容: 我在此阅读了bash手册页,但我不了解其中的区别。我对它们进行了测试,它们似乎产生了完全相同的结果。 如果未通过命令行参数设置值,我想设置变量的默认值。 上面的代码回显if 为null并回显if不为null的值。这样: 根据Bash手册页, 使用默认值。如果参数未设置或为null,则替换单词的扩展名。否则,将替换参数的值。 分配默认值。如果参数未设置或为空,则将单词扩展指定给参数。然后
苹果Swift语言中的和有什么区别? 在我的理解中,它是一种编译语言,但它不会在编译时检查类型。这让我很困惑。编译器如何知道类型错误?如果编译器不检查类型,难道不是生产环境的问题吗?