我什么时候应该使用“;var”;而不是“;对象”;

本文关键字:对象 什么时候 var | 更新日期: 2023-09-27 17:58:53

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

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

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

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

我什么时候应该使用“;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是否是一种糟糕的做法。简而言之,"不"。

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

来自Eric Lippert的文章隐式键入的使用和误用:

总之,我的建议是:

  • 必要时使用var;当您使用匿名类型时
  • 当声明的类型从初始值设定项,尤其是当它是对象创建。这消除了冗余
  • 如果代码强调语义"业务目的",并淡化其"机械"细节存储
  • 如果要使代码正确,则使用显式类型理解和维护
  • 无论是否使用"var",都要使用描述性变量名。变量名称应表示变量的语义,而不是细节其储存;"decimalRate"不正确;"利率"是好的

*有些人可能会对我"完全相同"的说法提出异议。对于匿名类型来说,这并不完全正确,但这是因为不能合法地写出类型名称。

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

CCD_ 16等效于使用实际(静态)类型。因此,当说明实际类型是不可能的或不方便的时,可以使用它。

  • var是必要的一种场景是在使用匿名类型时。它们没有名称(挑剔:只有编译器生成的名称,你不知道),所以你不能显式命名类型。

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

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

object0和object是两个完全不同的东西。

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

参见C#规范第26.1节:

在隐式类型化的局部变量声明中,要声明的局部变量的类型是从用于初始化变量的表达式。当局部变量声明指定var为类型并且没有名为var的类型在作用域中,声明是隐式类型的局部变量声明。

你的"严格观点"有点错误。。。var确实使用了实际类型。编译器分析右侧表达式的返回类型,并将其用作赋值的类型。

var不是类型。var对编译器说:"我不确定/不介意在这里键入正确的类型名称,请根据这句话的上下文为我推断类型"。

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