我在想何时应该使用var
?
C#中几乎所有东西,除了一些基本类型和少数更奇怪的情况外,都派生自Object。
那么使用实际类型或至少使用object
不是更好的做法吗?
(我已经编程有一段时间了,我的严格观点是var
是邪恶的)
我在想何时应该使用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
不是“邪恶”的。相反,它非常方便,正如我在其他地方所说的那样,我广泛使用它。 C# 的主要开发人员之一 Eric Lippert 也曾经详细讨论了var
是否是不良实践的问题。简而言之,“不是”。
var
是否是不好的编程习惯?为什么会选择使用 var
而不是显式类型转换? - Tom Gullenvar
和dynamic
混淆了,使用var
与完全写出类型名称完全相同*,编译器将它们渲染为相同的代码。Eric Lippert的博客提供了关于var
关键字的作用以及何时使用它的一些绝佳信息。总之,我的建议是:
- 在使用匿名类型时,必须使用
var
。- 当声明的类型从初始化器中明显时,特别是在对象创建时,应使用
var
。这消除了冗余。- 如果代码强调变量的语义“业务目的”,并淡化其存储的“机械”细节,请考虑使用
var
。- 如果必须正确理解和维护代码,则使用显式类型。
- 无论是否使用“var”,都应使用描述性变量名称。变量名称应表示变量的语义,而不是其存储的详细信息;“decimalRate”是不好的;“interestRate”是好的。
*一些人可能会对我的“完全相同”的说法提出异议。对于匿名类型,这并不严格正确,但这是因为您不能合法地写出类型名称。
object
会丢失所有静态类型信息(并且在值类型上使用它甚至会导致装箱)。因此,使用object
与使用var
非常不同。var
相当于使用实际(静态)类型。因此,当声明实际类型不可能或不方便时使用它。var
的一个场景是使用匿名类型。它们没有名称(挑刺:只有一个编译器生成的名称,你不知道),因此无法显式命名类型。var
方便的一种情况是当您的类型名称非常长时。这在使用嵌套泛型时有时会发生。foreach
循环中使用var
可以避免不安全的隐式转换。var
和object
是两个完全不同的东西。var
时,编译器会为您推断类型。而object
是一个对象,由于C#是一种强类型语言,所以您将失去有关实例的任何信息。你的“严格观点”有些误解...... var
确实使用了实际的类型。编译器分析右侧表达式的返回类型,并将其作为赋值的类型。
var
不是一种类型。 var
告诉编译器:“我不确定/懒得在这里键入正确的类型名称,请根据语句上下文推断类型。”
Object
将对象转换为类型 Object
。 结果您将失去任何类型信息,因此无法再调用在比 Object
更低层次中定义的特定方法、访问属性等。