我何时应该使用“var”而不是“object”?
我想知道你什么时候应该使用var
?
C#中的几乎任何东西,除了可能是原语和一些更奇怪的情况,都来自Object。
那么使用那些实际类型不是更好的做法吗? 或者至少是object
?
(我已经编程了一段时间,我的严格观点是var
是邪恶的)
你误解了: 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
不是“邪恶的”。 相反,它非常方便,正如我在其他地方所说的那样,我广泛使用它。 Eric Lippert是C#背后的主要人物之一,他也非常详细地写过var
是否是不好的做法。 简而言之,“不”。
我认为你将var
与dynamic
混为一谈。 使用var
完全相同*就好像你已经写出了整个类型名,并且编译器将它们呈现为相同的代码。 Eric Lippert的博客提供了一些关于var
关键字的作用以及何时使用它的优秀信息。
来自Eric Lippert的文章使用和误用隐式类型:
总结一下,我的建议是:
- 必要时使用var; 当您使用匿名类型时。
- 当初始值设定项中的声明类型很明显时,请使用var,尤其是在创建对象时。 这消除了冗余。
- 如果代码强调变量的语义“业务目的”并忽略其存储的“机械”细节,请考虑使用var。
- 如果需要这样做以正确理解和维护代码,请使用显式类型。
- 无论是否使用“var”,都使用描述性变量名称。 变量名称应表示变量的语义,而不是其存储的详细信息; “decimalRate”很糟糕; “interestRate”很好。
*有些人可能对我的“完全相同”声明有疑问。 对于匿名类型来说并不严格,但这是因为您无法合法地写出类型名称。
使用object
会丢失所有静态类型信息(当在值类型上使用时,它甚至会导致装箱)。 所以使用object
与使用var
非常不同。
另一方面, var
等同于使用实际(静态)类型。 因此,在说明实际类型不可能或不方便时,请使用它。
-
需要
var
一种情况是使用匿名类型。 它们没有名称(nitpick:只有您不知道的编译器生成的名称),因此您无法明确命名该类型。 -
使用
var
很方便的一种情况是当你的typename非常长时。 有时在使用嵌套generics时会发生这种情况。 -
在
foreach
循环中,您可以避免不安全的隐式转换。
var
和object
是两个完全不同的东西。
使用var
,编译器会为您推断类型。 object
是一个对象,您丢失了有关该实例的任何信息,因为C#是一种强类型语言。
请参阅C#规范中的第26.1节:
在隐式类型的局部变量声明中,声明的局部变量的类型是从用于初始化变量的表达式推断出来的。 当局部变量声明指定var作为类型且没有名为var的类型在作用域中时,声明是隐式类型的局部变量声明。
你的“严格观点”有点误导…… var
使用实际类型。 编译器分析右侧表达式的返回类型,并将其用作赋值的类型。
var
不是一种类型。 var
对编译器说’我不确定/不能打扰在这里键入正确的类型名称,请根据此语句的上下文为我推断类型’。
Object
将Object
强制转换为Object
类型。 因此,您将丢失任何类型信息,因此无法再调用在层次结构中比Object
低的级别定义的特定方法,访问属性等。