c#中的var关键字和object关键字的区别,顺便介绍下object的使用方法以及好处。

如题所述

var 是弱类型,类似于javascript中的var,@gylenter 提供的链接里说的很清楚

至于object,是C#中所有类型的基类,你应该知道
也就是说所有类型最中继承于它,不管任何类型都可以转变成object,比如
object v = 1; object s = "s"; object o = new List<int>();

但是,object是引用类型,当你把值类型转化的时候,肯定会有装拆箱操作,影响效率,所以,还是用明确的变量类型比较好
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-07-25
看看代码:
1: dynamic a = 10; 2: a = a + 10; 3: Console.WriteLine(a.GetType());
此段代码会输出 System.Int32,第二行不需要类型转换,因为在运行时识别类型。dynamic 在后台使用 System.Object 类型。但与 object 不同的是,动态类型不需要在编译时执行显式转换操作,因为它仅在运行时识别类型。关于dynamic和object的详细区别,看看《What is the difference between “dynamic” and “object” keywords?》
在 C# 类型系统中,dynamic 实际上是一个静态类型,这个关键字使得C# 获得了动态功能,同时仍然作为静态类型化语言而存在。这句话如何理解,就要理解它是如何实现动态绑定的,看看《Dynamic Binding in C#4.0》
下面的代码会通过编译,但运行时报错。因为当您使用 dynamic 关键字时,您就告诉编译器关闭编译时检查。
1: dynamic a = "test"; 2: a++;
来看看var关键字,从C#3.0开始加入的这个,我们对JavaScript的var比较熟悉,看看C#的var:
1: var a = 10; 2: a = a + 1; 3: Console.WriteLine(a.GetType());
此段代码会输入 System.Int32, 第二行不需要类型转换,var是强类型的。当使用 var 关键字声明变量时,将在编译时根据初始化字符串推断该变量的类型。 在运行时无法更改该变量的类型。
但要注意的是,var 关键字不过是一个指令,它让编译器根据变量的初始化表达式推断类型;var 不是类型。
最后看看object,关键字 object 表示 System.Object 类型,它是 C# 类层次结构中的根类型。 此关键字经常在编译时无法确定对象类型时使用,而这种情况经常在各种互操作性情形中发生。
但用object要避免类型转换(显式或隐式)
1: object a = 10; 2: a = (int)a + 10; 3: a = "test";
Dynamic可以用来干嘛?
发挥你的想象力,我可以想到的是可以用来做脚本支持,比如office支持用vba脚本写插件,那我们也可以用这个实现可编写脚本的应用。
第二个用处就是用动态方法包,动态方法包就是可在运行时添加和删除属性及方法的对象。System.Dynamic命名空间实际上是 DLR 的一部分,可以用 System.Dynamic.ExpandoObject 和 System.Expando.DynamicObject 类与新的 dynamic 关键字相结合实现自己需要的东东。
第三个用处是替代反射。有个例子,通过反射调用一个计算器对象的Add方法,先前不知道计算器的类型,只知道有个Add方法,代码是这样的:
1: object calc = GetCalculator(); 2: Type calcType = calc.GetType(); 3: object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, newobject[] { 10, 20 }); 4: int sum = Convert.ToInt32(res);
现在不用反射用dynamic就代码简洁了:
1: dynamic calc = GetCalculator(); 2: int sum = calc.Add(10, 20);
这样看来Dynamic还是挺有意思的。追问

不是dynamic关键字,是var关键字。

追答

var关键字是C# 3.0开始新增的特性,称为推断类型 .

可以赋予局部变量推断“类型”var 而不是显式类型。var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework 类库中定义的类型或任何表达式。

==================
上面的资料有点抽象不好理解.
示例:
原来我们定义变量,是要这样:

数据类型 变量名 = 值;

如:
int a = 1;
string b = "2";

也就是说,"必须先明确地"指定你的变量是什么数据类型,才能给它赋值.这点很重要,要记住才好比较.

现在在C# 3.0里,有了变化,就是可以不用像上面那样定义变量了.
如:
var a =1 ;
那这个a,是什么类型呢?和原来的做法不一样了.
奥妙就在这里,IDE或编译器会根据你给a 的值:1,来"推论,断定"a是一个整数类型.

同理:
var b = "2";
因为给b的值是"2"这样一个字符串,所以,b就是string类型...又如:VAR 是3.5新出的一个定义变量的类型
其实也就是弱化类型的定义
VAR可代替任何类型
编译器会根据上下文来判断你到底是想用什么类型的

至于什么情况下用到VAR 我想就是你无法确定自己将用的是什么类型
就可以使用VAR 类似 OBJECT
但是效率比OBJECT高点

使用var定义变量时有以下四个特点:

1. 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式:
var s;
s = “abcd”;

2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。

3. var要求是局部变量。

4. 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。简单的说:在方法块内定义的局部变量,当你不知道它的类型的时候可以使用VAR来定义。编译器会自动根据右边的表达式来确定这个变量的数据类型。

第2个回答  2012-07-25

c#中的var关键字和object关键字的区别,顺便介绍下object的使用方法以 ...
但是,object是引用类型,当你把值类型转化的时候,肯定会有装拆箱操作,影响效率,所以,还是用明确的变量类型比较好

c#3.0中,var关键字有什么作用,麻烦各位高手教我下,谢谢?
4. 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。

C#中 var是个什么意思?
VAR可代替任何类型,编译器会根据上下文来判断你到底是想用什么类型,类似 OBJECT,但是效率比OBJECT高点。我们可以赋予局部变量推断“类型”var而不是显式类型。var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework 类库中定义的类...

何时应在C#中合理运用“var”关键字?
综合来看,合理利用var关键字能够提升C#代码的简洁性和灵活性。然而,最佳实践是权衡代码简洁与类型清晰之间的平衡,确保代码不仅易于编写,也易于维护和理解。正确使用var的关键在于理解其适用场景,谨慎应用,以促进代码质量的提升。以上建议仅供参考。

面试必备:聊聊C#中的var和dynamic的区别
var和dynamic关键字在C#中的主要区别在于它们的绑定时间不同:var进行早期绑定,而dynamic则在运行时进行。var实际上是一种编译器提供的语法糖。在编译过程中,编译器会自动匹配var变量的实际类型,并用实际类型替换该变量的声明,相当于我们在编码时使用了实际类型声明。相比之下,dynamic在编译后会被视为...

C#:什么时候应该使用var?
C# 新增了关键字 var 在编译器能明确判断变量的类型时 它允许对本地类型进行推断 然而 对于何时应该使用它却存在某些争论 开发IDE工具的公司ReSharper的Ilya Ryzhenkov总结了使用var的一些好处 它有利于更好地为本地变量命名 它有利于设计更好的API 它促使对变量进行初始化 它消除了代码的混乱 它不需要...

面试官:C#的var和dynamic关键字,你能说清楚吗?
在C#编程中,var和dynamic是两个处理类型不确定情况的关键字,面试官可能借此考察求职者的理解能力。它们看似相似,但有着本质上的不同。var是C#中的隐式类型推断,它允许你在声明变量时不指定类型,编译器会根据赋值自动推断。例如,使用ILSpy观察,var变量在编译时被确定为具体类型,一旦类型确定,就不...

c#中的var是什么类型找半天没找到谁帮解释下
官方给出的解释是:可以赋予局部变量推断“类型”var 而不是显式类型。var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework 类库中定义的类型或任何表达式。我们举个例子。原来我们定义变量,是要这样:int a = 1;string b =...

C# Object与object的区别
没有区别,关键字object就是System.Object的别称,除非你在别的地方也定义一个Object类,但最好不要这样做。同理,string等价于System.String,int等价于System.Int32……以上是写代码时object与Object没有不同之处。如果你是说看到一篇文章里讲object如何如何,Object如何如何,那得看具体语境,很难全面...

C# Object 和 object 的区别
当然有区别了大Object代表类 小object代表关键字就是别名吧!使用的时候可以乱用,功能上没有影响,不过要是较真的话,声明时都应该使用小object就像应该用int声明变量而不是用int32一样

相似回答