var, object, dynamic的区别以及使用(转载)

var, object, dynamic的区别以及使用

阅读目录:

一. 为什么是它们三个

二. 能够任意赋值的原因

三. dynamic的用法

四. 使用dynamic的注意事项

拿这三者比较的原因是它们在使用的时候非常相似。你可以用它

们声明的变量赋任何类型的值。

看看下面的示例:

var a = 1;

object b = 1;

dynamic c = 1;

上面的例子中,看起来三者非常相似,但是背后的原理却是非常

不同。

var是C# 3中引入的,其实它仅仅只是一个语法. var本身并不是

一种类型, 其它两者object和dynamic是类型。

var声明的变量在赋值的那一刻,就已经决定了它是什么类型。

所以如果你这样使用,就会有编译错误:

var a = 1;

a = "Test";

object之所以能够被赋值为任意类型的原因,其实都知道,因为

所有的类型都派生自object. 所以它可以赋值为任何类型:

object a = 1;

a = "Test";

dynamic不是在编译时候确定实际类型的, 而是在运行时。

所以下面的代码是能够通过编译的,但是会在运行时报错:

dynamic a = "test";

a++;

三. dynamic的用法

1 直接使用该类型,可以非常方便的插入属性, 方法

dynamic person = new System.Dynamic.ExpandoObject();

person.id = 1;

person.title = "贵源网络";

person.url = "gzmsg.com";

person.co = "软件开发";

person.des = new Func<string>(() => person.title + 

person.url);

Response.Write(person.des());//结果:贵源网络gzmsg.com

2 枚举所有成员

foreach (var property in (IDictionary<String, Object>)

person)

{

Response.Write(property.Key + ": " + property.Value);

//结果:id: 1title: 贵源网络url: gzmsg.comco: 软件开发

des: System.Func`1[System.String]

}

3 简化反射

常用的处理反射的例子:

object calc = GetCalculator();

Type calcType = calc.GetType();

object res = calcType.InvokeMember( "Add", 

BindingFlags.InvokeMethod, null, new object[] { 10, 20 

});

int sum = Convert.ToInt32(res);

使用dynamic之后:

dynamic calc = GetCalculator();

int sum = calc.Add(10, 20);

四,使用dynamic的注意事项

有了dynamic,.net就以及有了动态类型的优势,但是由于对于

dynamic类型的所有操作,都是在运行时确定的,所有错误无法在

编译时候出现,使用的时候,就需要非常小心。

因为dynamic是类型,所以如果函数接受的是确定类型的参数,是

不能传入dynamic类型的,这样会有编译错误。比如:

复制代码

public int Add(int a, int b){

return a + b;

}

dynamic test1 = 1;

dynamic test2 = 2;

Add(test1, test2);

另外,在我们自己在写函数时,最好不要将dynamic类型作为函数

的参数,这就像是使用object作为函数参数一样,会为程序的维

护带来后续的麻烦。

没有人能够确定使用者传入的是什么,而且编译时候不会有问题

。如果错误出现在运行时,就有可能是灾难。



1. var表示“变量的类型是在编译时决定的”, var让你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型, var只能用于局部变量的定义,你不能把类的属性定义成 var,也不能把方法的返回值类型或者是参数类型定义成var

2. dynamic表示“变量的类型是在运行时决定的”,动态语言运行时(dynamic language runtime DLR)是.NET Framework 4 Beta 1中的一组新的API,它提供了对c#中dynamic类型的支持, dynamic告诉编译器,根本就别理究竟是啥类型,运行时再推断不迟,dynamic类型并没有跳过类型校验,只是延迟到了运行时。如果在运行时,检测到类型不兼容,照样会抛出异常。变量,属性,方法返回值类型及参数类型都可定义为dynamic。

你可能在以下情况下使用dynamic:

1.COM对象

2.动态语言(如IronPython,IronRuby等)对象

3.反射对象

4.C# 4.0中动态创建的对象

因此,dynamic与var具有截然不同的含义。



1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型。

2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段,参数。

3.表达式不能转型为var,但能转型为dynamic。

4.必须显式初始化用var声明的变量,但无需初始化用dynam声明的变量。

常有人会拿var这个关键字来和dynamic做比较。实际上,var和dynamic完全是两个概念,根本不应该放在一起做 比较。var实际上是编译期抛给我们的“语法糖”,一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。而dynamic被编译后,实际是一个 object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。

这从visual studio的编辑器窗口就能看出来。以var声明的变量,支持“智能感知”,因为visual studion能推断出var类型的实际类型,而以dynamic声明的变量却不支持“智能感知”,因为编译器对其运行期的类型一无所知。对 dynamic变量使用“智能感知”,会提示“此操作将在运行时解析”


http://www.cnblogs.com/stone_w/archive/2011/02/17/1957014.html

var, object, dynamic的区别以及使用(转载)

时间: 2024-10-08 10:41:06

var, object, dynamic的区别以及使用(转载)的相关文章

理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

原文:理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你可以用它们声明的变量赋任何类型的值. 看看下面的示例: var a = 1; object b = 1; dynamic c = 1; 你还可以使用关键字为它们赋上更加复杂的类型 v

var object dynamic的区别

一.var var本身不是一种类型,只是一种语法糖:var声明的变量在赋值的时候即已决定其变量类型,编译时会进行校验. 二.object object是所以类型的基类,故可以赋任何类型的值. 三.dynamic dynamic是在运行时去确定实际类型,而在编译时是不进行校验的. 参考资料: http://www.cnblogs.com/sntetwt/p/3530937.html

Var与Dynamic的区别

1.var与dynamic的区别   C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,但其实它们是有本质的区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的值,而dynamic则可以不提供,它是在运行时才确定类型. 1 static void Main(string[] args) 2 { 3 //var 在编译阶段已经确定类型 4 var number = 3; 5 6 //dynamic在编译期间不进行任何的类型检查,而是将类型检查放到了运行期 7

简述C#中关键字var和dynamic的区别

C#中关键字var和dynamic的区别如下: 1.var申明的变量必须初始化,dynamic申明的变量无需初始化. 2.var关键字只能在方法内部申明局部变量,dynamic关键字可用于局部变量,字段,参数. 3.表达式不能转型为var,但可以转型为dynamic. 4.用var关键字声明变量时,编译时会根据初始化值来推断该变量的类型,用dynamic关键字声明变量时,编译的时候不执行类型检查,仅在运行时识别对象的类型. 注:参考<CLR via C# 4>

JavaScript中object和Object有什么区别

JavaScript中object和Object有什么区别,为什么用typeof检测对象,返回object,而用instanceof 必须要接Object呢 -------------------------------------------------------------------- 这个问题和我之前遇到的问题非常相似,我认为这里有两个问题需要解决,一个是运算符new的作用机制,一个是function关键字和Funtion内置对象之间的区别.看了一些前辈的博客和标准,这里帮提问者总结一

var与dynamic

var与dynamic 如果你用MVC写过程序,那么你应该知道ViewBag这个用于前后台的数据传递工具,那么你是否对ViewBag的用法感到过疑惑呢? ViewBag.Mode1l=new object(); ViewBag.Model2=new object(); ViewBag.Model3=new object(); ...... 我们知道,在使用对象属性的时候要先申明(即这个对象的类中已经定义了这个属性)才能使用(此时VS的自动提示能弹出此类的所有属性),然而使用ViewBag时你会发

C#中 Var 和 dynamic 整理介绍

常有人会拿var这个关键字来和dynamic做比较.实际上,var和dynamic完全是两个概念,根本不应该放在一起做比较.var实际上是编译期抛给我们的"语法糖",一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的.而dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期. 以var声明的变量

.net基础扫盲--可变类型(var,dynamic)

之所以要谈及var和dynamic,是因为在使用EF框架和使用MVC的时候,会很频繁的用到他们,所以不得不提他们,以便在接触EF和MVC的时候能够很好的理解和熟练的应用. 先简单说一下var,虽被称作是可变类型,但他并不是一种若类型,只不过他是通过程序推断来确定类型的. 我们可以这么写: static void Main(string[] args) { var i = 10; //经过程序的推断,i最终被推断为 int整型 var j = "10";//同样,经程序推断为字符型 Co

C#中var和dynamic

var与dynamic这两个关键字,只是看起来很相似,仅此而已!var表示"变量的类型是在编译时决定的",但是dynamic表 示"变量的类型是在运行时决定的".因此,dynamic与var具有截然不同的含义.var让 你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型.dynamic更厉害,它告诉编译器,根本就别理究竟是啥类型,运行 时再推断不迟.var只能用于局部变量的定义,你不能把类的属性定义成 var,也不能把方法的返回值类型或者是参 数类型定