4

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

C# 中的几乎所有东西,除了可能的基元和一些更奇怪的情况,都派生自 Object。

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

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

4

6 回答 6

29

你误会了: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是不好的做法。简而言之,“不”。

于 2011-06-08T16:04:11.753 回答
9

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

来自 Eric Lippert 的文章隐式类型的使用和误用:

总结一下,我的建议是:

  • 必要时使用 var;当您使用匿名类型时。
  • 当声明的类型在初始化程序中很明显时,请使用 var,尤其是在创建对象时。这消除了冗余。
  • 如果代码强调变量的语义“业务目的”并淡化其存储的“机械”细节,请考虑使用 var。
  • 如果需要这样做以正确理解和维护代码,请使用显式类型。
  • 无论您是否使用“var”,都使用描述性变量名称。变量名应该代表变量的语义,而不是其存储的细节;“decimalRate”不好;“利率”很好。

*有些人可能会对我的“完全相同”声明提出异议。对于匿名类型,严格来说并非如此,但那是因为您不能合法地写出类型名称。

于 2011-06-08T16:11:01.927 回答
5

使用object你会丢失所有静态类型信息(当用于值类型时,它甚至会导致装箱)。所以 usingobject与 using 非常不同var

var另一方面等效于使用实际(静态)类型。因此,当说明实际类型不可能或不方便时,您可以使用它。

  • 一种var必要的情况是使用匿名类型时。它们没有名称(nitpick:只有编译器生成的您不知道的名称),因此您无法明确命名类型。

  • 使用方便的一种情况var是当您的类型名很长时。使用嵌套泛型时有时会发生这种情况。

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

于 2011-06-08T16:04:49.237 回答
4

varobject是两个完全不同的东西。

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

请参阅 C# 规范中的第 26.1 节:

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

于 2011-06-08T16:05:00.727 回答
2

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

于 2011-06-08T16:04:55.853 回答
1

var不是类型。var对编译器说“我不确定/不想在此处键入正确的类型名称,请根据此语句的上下文为我推断类型”。

Object将对象强制转换为 type Object。结果,您丢失了任何类型信息,因此无法再调用在层次结构中低于Object.

于 2011-06-08T16:05:34.860 回答