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

时间:2009-09-16 03:44:30

标签: c# linq

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

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

11 个答案:

答案 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然后迭代仍然可以在进一步改变的情况下工作。