有人发现除了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。 这确实限制了特定方法的返回类型更改时我必须进行的代码更改量。 例如,如果我有以下方法:
ListGetList() { return myList; }
我可以在整个地方进行代码行,进行局部变量赋值,如下所示:
Listlist = GetList();
如果我更改GetList()以返回IList
IListGetList() { return myList; }
相反,如果我编码如下:
var list = GetList();
然后我只需要更改GetList(),其余的将通过编译进行validation。 我们只使用一次代码更改即可运行。 当然,如果根据列表的代码是List
我最喜欢的非LINQ用法与foreach
一起使用。 指定类型显式指示编译器在必要时执行强制转换(这可能导致运行时错误),而简单地使用var
是一种简单的方法来确保我确实拥有我认为具有的项类型。
我已经在某处读过,如果你在一个非你编写的模块中调用代码,并且返回一个类型的对象将来可能会有变化,那么建议你使用“var”。 如果您要为该外部模块编写包装器,并且只转发结果,而不是使用var来临时存储它,如果/当外部调用返回的数据类型发生更改时,将使代码仍然有效。 此外,如果您知道此结果是某种类型的集合,但又不是特别稳定的类型,则分配给var然后迭代仍然可以在进一步更改时使用。