有人发现除了LINQ之外还使用“var”吗?

只是好奇。 我大约99.999%肯定没有…但是什么?

编辑:这些是好的答案(节省打字时间或使代码更简洁“可读性”)。 我想我应该澄清“使用”的意思 – 一些没有“var”就无法完成的构造/设计。

在可读性方面哪个更好?

AReallyReallyLongBusinessObjectName obj = new AReallyReallyLongBusinessObjectName(); 

要么

 var obj = new AReallyReallyLongBusinessObjectName(); 

我说在可读性方面,因为使用var对你的应用程序绝对没有影响,因为这两个语句在编译时生成相同的IL。

对编辑的回应:没有什么需要你使用var(除了匿名类型) – 它只是语法糖。

我经常在foreach循环中使用它:

 foreach(var item in collection) 

var主要用于匿名类型(如果没有它,则无法创建)。 我也看到其他人通过类型推断使用它来减少输入和冗余类型信息。

我个人发现,当它用于减少输入时,它会损害可读性 – 请记住,您花费1%的时间编写代码,99%的时间阅读它。

 // the compiler may be able to infer the type // of "foo" but I certainly cannot without // viewing the implementation of "doSomething". var foo = doSomething(); 

编辑:要记住的主要事项(这对编码风格的所有问题都很常见)是你需要选择一种风格并一致地使用它。 只要你喜欢它并且有理由使用它,你觉得它是合理的,那么你就赢了这场战斗:)

我一直使用var– 特别是当类名很长时

它没有为我发布问题,因为我的方法通常以这样的方式命名,通过只看一眼名称,我可以推断出类型。

如果我不能,我将使用VS 2008 intellisense来帮助我,或者我只使用Resharper var => class name converter将其转换为显式名称。

我发现var一个很好用的另一种情况是在foreach循环中:

 foreach(var id in idList) { // do what you will here } 

匿名课怎么样?

 var mySomething = new { Name = "Hello", Age=12 }; 

是的,我在为具有长名称和foreach循环的类创建对象时始终使用它

编辑:我不认为var可以在设计或任何构造中发挥主要作用……因为它只能在本地使用,即在方法或范围内。

var的另一个主要限制是你不能将它用作方法参数返回类型 。 你甚至不能在课堂上将它声明为字段。 这意味着我们可以使用var来节省打字时间或者使用“LINQ”使代码更简洁

我发现它在原型设计中非常有价值,它可以让我快速存储函数/属性的结果,并且还可以让我从这些函数调整返回类型,之后清理更少。 这是一个(小)有点像方法的接口,它让我更少担心具体的返回类型和更多关于方法的意图。

正如其他人所说,在初始化对象的新实例时使用它也很好; 拥有Foo foo = new Foo(); 是多余的。 var foo = new Foo(); 如果有多个声明,那就是可读的,甚至更好……

 var connString = BuildConnectionString(); var sqlConn = new SqlConnection(connString); var commandText = BuildCommandText(); var sqlComm = new SqlCommand(commandText, sqlConn); 

 string connString = BuildConnectionString(); SqlConnection sqlConn = new SqlConnection(connString); string commandText = BuildCommandText(); SqlCommand sqlComm = new SqlCommand(commandText, sqlConn); 

当使用MVC并让客户端控制器返回所有ajax请求时,您几乎总是使用var,因为使用匿名类型时,您只能将应用程序所需的数据发送回客户端。

 var response = new { var1 = "bla", var2 = "foo" }; return JSon(response); 

我几乎每个赋值给局部变量使用var。 这确实限制了特定方法的返回类型更改时我必须进行的代码更改量。 例如,如果我有以下方法:

 List  GetList()
 {
     return myList;
 }

我可以在整个地方进行代码行,进行局部变量赋值,如下所示:

 List  list = GetList(); 

如果我更改GetList()以返回IList ,那么我必须更改所有这些赋值行。 如果我更改返回类型,N行赋值等于N + 1代码更改。

 IList  GetList()
 {
     return myList;
 }

相反,如果我编码如下:

 var list = GetList(); 

然后我只需要更改GetList(),其余的将通过编译进行validation。 我们只使用一次代码更改即可运行。 当然,如果根据列表的代码是List 而不是IList ,编译器会抱怨; 但那些应该少于N.

我最喜欢的非LINQ用法与foreach一起使用。 指定类型显式指示编译器在必要时执行强制转换(这可能导致运行时错误),而简单地使用var是一种简单的方法来确保我确实拥有我认为具有的项类型。

我已经在某处读过,如果你在一个非你编写的模块中调用代码,并且返回一个类型的对象将来可能会有变化,那么建议你使用“var”。 如果您要为该外部模块编写包装器,并且只转发结果,而不是使用var来临时存储它,如果/当外部调用返回的数据类型发生更改时,将使代码仍然有效。 此外,如果您知道此结果是某种类型的集合,但又不是特别稳定的类型,则分配给var然后迭代仍然可以在进一步更改时使用。