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

Joa*_*nge 2 .net c#

使用这样的LINQ时:

collection.Select (...);
Run Code Online (Sandbox Code Playgroud)

是否更好地说:

var result = ...
Run Code Online (Sandbox Code Playgroud)

要么:

IEnumerable<Point3> result = ...
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*tes 6

这真的取决于具体细节.如果从代码的其余部分清楚地看出变量是什么类型,或者更重要的是,如果知道它究竟是什么类型并不重要,那么它就var很有用.但是,如果类型声明确保您的代码更易于维护且更易于阅读,那么请更具体并提供类型.

例如,如果你的查询后面紧跟一个循环结果并且显式地键入了该循环,var那么这是一个合理的选择,因为它节省了输入的时间,并且不会将代码混淆到维护更难的点,例如如:

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

实际上,在刚刚显示的示例中,甚至Size可以替换var为代码仍然可以合理地维护,因为方法调用的类型就足够了.

但是,如果预期查询返回单个值,然后在算术运算中使用,则应该使用显式类型化结果,如:

// 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;
Run Code Online (Sandbox Code Playgroud)

  • 有一种常见的误解,即var不是强类型的.但是当涉及到类型var和IEnumerable <Size>在上面的例子中是等价的.不同之处在于编译器测试右侧可以分配到左侧(IEnumerable <T>),或者编译器是否从右侧推断出左侧的类型.但是,该变量仍然是强类型的 (3认同)