我何时应该使用“var”而不是“object”?

时间:2011-06-08 16:02:35

标签: c# syntax var

我想知道你什么时候应该使用var

C#中的几乎任何东西,除了可能是原语和一些更奇怪的情况,都来自Object。

那么使用那些实际类型不是更好的做法吗?或至少object

(我已经编程了一段时间,我的严格观点是var是邪恶的)

6 个答案:

答案 0 :(得分:30)

你误解了:var不是一种类型。 var指示编译器根据其初始化对变量使用正确的类型。

示例:

var s = "hello";         // s is of type string
var i = 42;              // i is of type int
var x = new [] { 43.3 }; // x is of type double[]
var y = new Foo();       // y is of type Foo

使用var时,您的变量仍然是强类型的。

因此,var不是“邪恶的”。相反,它非常方便,正如我所说elsewhere,我广泛使用它。 Eric Lippert是C#背后的主要人物之一,他还撰写了in great detail关于var是不良做法的文章。简而言之,“不”。

答案 1 :(得分:9)

我认为你将vardynamic混为一谈。使用var 完全相同* 就像您已经写出整个类型名称一样,并且编译器将它们呈现为相同的代码。 Eric Lippert的博客提供了一些关于var关键字的作用以及何时使用它的一些优秀信息。

来自Eric Lippert的文章 Uses and misuses of implicit typing:

  

总结一下,我的建议是:

     
      
  • 必要时使用var;当你使用匿名类型时。
  •   
  • 当声明的类型显而易见时使用var   初始化程序,特别是如果它是   对象创建。这消除了   冗余。
  •   
  • 如果代码强调语义“业务”,请考虑使用var   变量和淡化的目的   它的“机械”细节   存储
  •   
  • 如果要使代码正确,则使用显式类型   理解和维护。
  •   
  • 无论您是否使用“var”,都使用描述性变量名称。   变量名称应代表   变量的语义,而不是细节   它的存储; “decimalRate”很糟糕;   “interestRate”很好。
  •   

*有些人可能对我的“完全相同”声明有疑问。对于匿名类型并不严格,但这是因为不能合法地写出类型名称。

答案 2 :(得分:5)

使用object您将丢失所有静态类型信息(当在值类型上使用时,它甚至会导致装箱)。因此,使用object与使用var非常不同。

另一方面,

var相当于使用实际(静态)类型。因此,在说明实际类型不可能或不方便时,请使用它。

  • 需要var的一种情况是使用匿名类型。它们没有名称(nitpick:只是一个你不知道的编译器生成的名称),所以你不能明确地命名这个类型。

  • 使用var很方便的一种情况是当你的typename非常长时。有时在使用嵌套泛型时会发生这种情况。

  • foreach循环中,您可以避免不安全的隐式转换。

答案 3 :(得分:4)

varobject是完全不同的两件事。

使用var,编译器会为您推断类型。 object是一个对象,您丢失了有关该实例的任何信息,因为C#是一种强类型语言。

参见C#规范中的第26.1节:

  

在隐式类型的局部变量声明中,声明的局部变量的类型是从中推断出来的   用于初始化变量的表达式。当局部变量声明指定var作为类型而没有   名为var的类型在范围内,声明是隐式类型的局部变量声明。

答案 4 :(得分:2)

你的“严格观点”有点误导...... var是否使用实际类型。编译器分析右侧表达式的返回类型,并将其用作赋值类型。

答案 5 :(得分:1)

var不是一种类型。 var对编译器说'我不确定/不能打扰在这里键入正确的类型名称,请根据此语句的上下文为我推断类型'。

Object将对象强制转换为Object类型。因此,您将丢失任何类型信息,因此无法再调用在层次结构中低于Object的级别定义的特定方法,访问属性等。