好奇。我大约99.999%肯定没有...但是什么?
编辑:这些都是正确的答案(节省打字时间或使代码更简洁“可读性”)。我想我应该澄清“使用”的意思 - 一些没有“var”就无法完成的构造/设计。
答案 0 :(得分:24)
在可读性方面哪个更好?
AReallyReallyLongBusinessObjectName obj = new AReallyReallyLongBusinessObjectName();
OR
var obj = new AReallyReallyLongBusinessObjectName();
我在可读性方面说,因为使用var对你的应用程序没有任何影响,因为这两个语句在编译时会生成相同的IL。
对编辑的反应:没有什么需要你使用var(除了匿名类型) - 它只是语法糖。
答案 1 :(得分:16)
我经常在foreach
循环中使用它:
foreach(var item in collection)
答案 2 :(得分:9)
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();
编辑:要记住的主要事项(这对编码风格的所有问题都很常见)是您需要选择一种风格并始终如一地使用它。只要你喜欢它并有理由使用它,你觉得它是合理的,那么你就赢了这场战斗:)
答案 3 :(得分:3)
我一直使用var
- ,尤其是当课程名称很长时。
它没有为我发布问题,因为我的方法通常以这样的方式命名,只需看一眼名称,我就可以推断出类型。
如果我不能,我将使用VS 2008 intellisense帮助我,或者我只使用Resharper var =>类名转换器将其转换为显式名称。
我发现var
的一个很好用的另一个案例是foreach
循环:
foreach(var id in idList)
{
// do what you will here
}
答案 4 :(得分:3)
匿名课怎么样?
var mySomething = new { Name = "Hello", Age=12 };
答案 5 :(得分:1)
是的,我一直在使用长名称和foreach
循环
编辑: 我不认为var可以在设计或任何构造中起主要作用......因为它只能在本地使用,即在方法或范围内使用。
var的另一个主要限制是您不能将其用作方法参数或作为返回类型。您甚至无法在课堂上将其声明为字段。这意味着我们可以使用var来节省打字时间或者使代码更简洁,因为“可读性”和LINQ
答案 6 :(得分:1)
我最喜欢的非LINQ用法与foreach
一起使用。指定类型显式指示编译器在必要时执行强制转换(这可能导致运行时错误),而简单地使用var
是一种简单的方法来确保我确实拥有我认为的项目类型。
答案 7 :(得分:1)
我发现它在原型设计中非常有价值,它可以让我快速存储函数/属性的结果,并且还可以让我从这些函数中调整返回类型,之后进行较少的清理。这是一个(wee)有点像方法的接口,它让我更少关注具体的返回类型和更多关于方法的意图。
正如其他人所说,在初始化对象的新实例时使用它也很好; 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);
VS
string connString = BuildConnectionString();
SqlConnection sqlConn = new SqlConnection(connString);
string commandText = BuildCommandText();
SqlCommand sqlComm = new SqlCommand(commandText, sqlConn);
答案 8 :(得分:1)
当使用MVC并让客户端控制器返回所有ajax请求时,您几乎总是使用var,因为使用匿名类型时,您只能将应用程序所需的数据发送回客户端。
var response = new { var1 = "bla", var2 = "foo" };
return JSon(response);
答案 9 :(得分:1)
我几乎对每个局部变量赋值使用var。如果特定方法的返回类型发生更改,这实际上限制了我必须进行的代码更改量。例如,如果我有以下方法:
List<T> GetList() { return myList; }
我可以在整个地方进行代码行,进行局部变量赋值,如下所示:
List<T> list = GetList();
如果我更改GetList()以返回IList&lt; T&gt;相反,那么我必须改变所有这些分配线。如果我更改返回类型,N行赋值等于N + 1代码更改。
IList<T> GetList() { return myList; }
相反,如果我编码如下:
var list = GetList();
然后我只需要更改GetList(),其余的将通过编译进行验证。我们只使用一次代码更改即可运行。当然,如果根据列表的代码是List&lt; T&gt;,则编译器会抱怨。而不是IList&lt; T&gt ;;但那些应该少于N.
答案 10 :(得分:0)
我已经在某处读过,如果你在一个非你编写的模块中调用代码,并且返回一个类型的对象将来会发生变化,建议你使用“var”。如果要为该外部模块编写包装器,并且只转发结果,而不是使用var来临时存储它,如果/当外部调用返回的数据类型发生更改时,将使代码仍然有效。另外,如果你知道这个结果是某种类型的集合,但又不是一种特别稳定的类型,那么分配给var然后迭代仍然可以在进一步改变的情况下工作。