C# 有人发现了“使用”的意思吗;var";除了LINQ?

C# 有人发现了“使用”的意思吗;var";除了LINQ?,c#,linq,C#,Linq,只是好奇。我大约99.999%确定没有……但有什么吗 编辑:这些都是正确的答案(为了“可读性”节省键入时间或使代码不那么冗长)。我想我应该澄清我所说的“使用”是什么意思——一些没有“var”就无法完成的构造/设计 我一直使用var,尤其是当类名很长时 这对我来说并没有什么问题,因为我的方法通常是以这样一种方式命名的,只要看一下名称,我就可以推断出类型 如果我不能,我将使用VS 2008 intellisense来帮助我,或者我只使用var=>类名转换器将其转换为显式名称 我发现var的另一个重要

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


编辑:这些都是正确的答案(为了“可读性”节省键入时间或使代码不那么冗长)。我想我应该澄清我所说的“使用”是什么意思——一些没有“var”就无法完成的构造/设计

我一直使用
var
尤其是当类名很长时

这对我来说并没有什么问题,因为我的方法通常是以这样一种方式命名的,只要看一下名称,我就可以推断出类型

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

我发现
var
的另一个重要用途是在
foreach
循环中:

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

在可读性方面,什么更好

AReallyReallyLongBusinessObjectName obj = new AReallyReallyLongBusinessObjectName();

我之所以说可读性,是因为使用var对应用程序绝对没有影响,因为这两条语句在编译时生成相同的IL


对编辑的响应:没有任何东西需要您使用var(除了anon类型)-它只是语法上的糖分。

是的,我一直在使用它,同时在
foreach
循环中为长名称的类创建对象

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


var的另一个主要限制是不能将其用作方法参数作为返回类型。您甚至不能在类中将其声明为字段。这意味着我们可以使用var来节省键入时间,或者为了“可读性”而减少代码的冗余,而使用LINQ时,我经常在
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 mySomething = new { Name = "Hello", Age=12 };

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

我发现它在原型设计中非常宝贵,它使我能够快速存储函数/属性的结果,还使我能够调整这些函数的返回类型,从而减少后续清理。它有点像方法的接口,它让我不用担心具体的返回类型,而更关心方法的意图

正如其他人提到的,在初始化对象的新实例时使用它也很好;拥有
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


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

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

我在某个地方读到过,建议您在调用非您编写的模块中的代码时使用“var”,这样会返回一个对象,该对象的类型将在将来发生更改。如果要向该外部模块写入包装器,并且只转发结果,那么使用var临时存储将使代码在外部调用返回的数据类型发生更改时仍然有效。另外,如果您知道这个结果是某种集合,但又不是一种特别稳定的集合,那么赋值给var,然后迭代仍然可以在进一步更改的情况下工作。

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

List<T> GetList() { return myList; } List GetList() { 返回myList; } 我可以在各处编写代码行,执行局部变量赋值,如下所示:

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

IList<T> GetList() { return myList; } IList GetList() { 返回myList; } 相反,如果我的代码如下所示:

var list = GetList(); var list=GetList();
然后我只需要更改GetList(),其余的将通过编译进行验证。我们只进行了一次代码更改就可以运行了。当然,如果存在依赖列表的代码是列表而不是IList,编译器会抱怨;但这些应该少于N。

类似的问题只是对回答者和评论者抱怨var和dynamic的评论。它们是您不必使用的功能。停止抱怨。var是不好的,应该避免使用,因为在编写代码时,您不应该懒得编写很长的业务对象名称,而是应该以您或以后阅读代码的任何人都能看到的方式编写。var如果被滥用,则是不好的,就像任何计算机语言的任何功能一样。Agree的可能重复项,但仅在与您的示例等方法一起使用时,而不是在创建新对象或使用一些常见的方法(如新的扩展名Where()、any()、First()等)时使用 IList<T> GetList() { return myList; } var list = GetList();