C# 在LINQ查询中使用var声明集合有什么问题吗?

C# 在LINQ查询中使用var声明集合有什么问题吗?,c#,.net,C#,.net,像这样使用LINQ时: collection.Select (...); 还是说: var result = ... 或: IEnumerable结果=。。。 我问它是因为它总是IEnumerable,对吗?在这种情况下,是否更明确一些?我更喜欢var。它又短又甜。另外,如果你在路上从第3点更改到第4点,那么就少了一个更改的地方。生成的IL是相同的,因此这是一个风格/个人偏好问题 就我个人而言,我通常更喜欢编写var,因为当我要基于集合的变量名枚举集合时,我所做的事情通常非常明显。这就是说

像这样使用LINQ时:

collection.Select (...);
还是说:

var result = ...
或:

IEnumerable结果=。。。

我问它是因为它总是
IEnumerable
,对吗?在这种情况下,是否更明确一些?

我更喜欢
var
。它又短又甜。另外,如果你在路上从第3点更改到第4点,那么就少了一个更改的地方。

生成的IL是相同的,因此这是一个风格/个人偏好问题


就我个人而言,我通常更喜欢编写var,因为当我要基于集合的变量名枚举集合时,我所做的事情通常非常明显。这就是说,有时显式可以使代码更具可读性,写出来是有益的。

var更好,因为它可以节省键入并使代码在语义上更清晰,但假设结果总是IEnumerable是错误的。IQueryable也是一种可能性,这取决于您正在处理的集合类型,也取决于您正在执行的linq语句

这取决于具体情况。如果从代码的其余部分可以清楚地知道变量是什么类型,或者更重要的是,如果知道变量的确切类型并不重要,那么
var
是有用的。但是,如果类型声明可以确保代码更易于维护和阅读,那么就更具体地提供类型

例如,如果查询后紧接着是结果上的一个循环,并且该循环是显式键入的,
var
是一个合理的选择,因为它可以节省键入时间,并且不会将代码混淆到更难维护的程度,例如:

// uses var instead of IEnumerable<Size>
var items = from item in myItems select item.Size;
foreach (Size size in items)
{
   RecalculateLayout(size);
}

我相信这要看情况。如果是列表、IEnumerable、IQueryable或其他什么,你通常不会担心你真正得到了什么


我想,当你得到的类型对理解很重要时,最好是写类型:)。

好吧,它可能是IQueryable而不是IEnumerable

当我编写代码时,我通常默认使用var,因为它需要更少的输入和思考。在签入之前的某个时刻(通常在我完成这行之后),我将var更改为精确类型


使用Resharper插件,将“var”替换为实际类型是一个键盘快捷键。这样,我就两全其美了。我认为使用显式类型可以使代码更容易检查,因此这就是应该签入的内容。

我觉得如果您实际上要返回已知类型,显式始终是一种方法。声明在处理匿名类型时需要使用var。我看到代码中到处都在使用var,而不是处理匿名类型,对我来说,这就像是懒散的编码。如果我们使用像Python这样的duck类型的语言进行编码,我可以看到在任何地方都使用var,但是考虑到您知道将返回什么类型的情况,我认为显式的更好,不仅对您,而且对未来的代码维护者都是如此。

您并不总是知道
IEnumerable
的类型是什么,这完全取决于Select调用的内容。如果您返回声明的类型,那么使用var是可选的


之所以创建Var,是因为在使用LINQ时,您会多次创建无法声明的匿名类型。

我发现,在编写LINQ查询时,它们往往会发生很大的变化。我可能会选择一个对象,然后决定只需要该对象的特定属性,或者使用匿名类型将两个对象的属性合并为一个对象。或者,我可能决定要一个列表,或者只是将其作为IQueryable保留,因为如果满足某个条件,我希望稍后向其添加where子句。使用
var
,这项工作非常自然、顺利。否则,您将不得不不断更改结果的类型


在大多数情况下,你并不真正关心类型,这并不重要。查询本身倾向于保存更有价值的信息,而不是类型。

最近有人告诉我,var是这种情况下的最佳实践,因为它仍然是强类型的。它的类型是在编译时确定的,并且它得到了编译器voodoo分配给它的强类型

关键是,var应该总是像预期的那样“正常工作”,所以使用它

我使用var语法作为另一种自我记录代码的方式。如果值必须是特定类型对函数逻辑很重要,则使用类型名称。如果您只是将其用作临时变量,而类型并不重要,那么var可以帮助您理解这一点


当然,在快速脏的应用程序中,我之所以使用它是因为我很懒:)

如果类型名有点长(或使用泛型),我喜欢在同一行声明变量和实例化类型时使用var:


有一种常见的误解,认为var不是强类型的。但是,在上面的示例中,当涉及类型时,var和IEnumerable是等效的。不同之处在于编译器测试是否可以将右侧指定给左侧(IEnumerable),或者编译器是否从右侧推断左侧的类型。然而,变量仍然是强类型的。实际上,Di并没有说var在编译代码的意义上不是强类型的——仅仅是在“作为人阅读代码”的意义上。
// uses var instead of IEnumerable<Size>
var items = from item in myItems select item.Size;
foreach (Size size in items)
{
   RecalculateLayout(size);
}
// using var here means you can't properly interpret
// the intention for the following line or where an error
// lies if something changes to say, use double instead of int.
int offset = myItems.First().Offset;
myConvertedValue = originalValue + offset;
var dictionary = new Dictionary<string, string>();

// instead of:

Dictionary<string, string> dictionary = new Dictionary<string, string>();
foreach (var item in dictionary) { /* do stuff */ }

// instead of:

foreach (KeyValuePair<string, string> item in dictionary) { /* do stuff */ }
using (var inputStream = CreateInputStream())
using (var inputReader = new StreamReader(inputStream, Encoding.UTF8))
using (var outputStream = CreateOutputStream())
using (var outputWriter = new StreamWriter(outputStream, Encoding.UTF8))
{ /* do stuff */ }

// instead of:

using (Stream inputStream = CreateInputStream())
using (StreamReader inputReader = new StreamReader(inputStream, Encoding.UTF8))
using (Stream outputStream = CreateOutputStream())
using (StreamWriter outputWriter = new StreamWriter(outputStream, Encoding.UTF8))
{ /* do stuff */ }