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