在linq中使用var

时间:2010-05-02 17:30:57

标签: linq anonymous-types

var在以下情况下真正做了什么?

var productInfos =
from p in products
select new { p.ProductName, p.Category, Price = p.UnitPrice };

6 个答案:

答案 0 :(得分:9)

这两行:

var productInfos = from p in products 
select new { p.ProductName, p.Category, Price = p.UnitPrice };

IEnumerable<CompilerGeneratedType> productInfos = from p in products 
select new { p.ProductName, p.Category, Price = p.UnitPrice };

是等价的。 CompilerGeneratedType是一种将由编译器创建的类型,具有三个公共属性ProductName, Price, and Categoryvar有两个原因:

  1. CompilerGeneratedType将由编译器生成,因此您无法在声明中使用类型名称。
  2. 您不必过于考虑结果的集合类型。 Linq可以做到这一点,你不必担心它。

答案 1 :(得分:7)

var是编译器创建的("anonymous") type的占位符,其中包含三个属性ProductNameCategoryPrice

它不是变体(例如在Visual Basic中)。它是一种具体类型,可以在代码中的其他位置使用。

答案 2 :(得分:4)

在这种特殊情况下,productInfos的类型是编译器生成的Anonymous Type,具有3个属性,ProductName,Category和Price。

答案 3 :(得分:3)

带有var的

变量是隐式类型的局部变量,它们是强类型的,就像你自己声明了类型一样,但编译器确定了类型。它得到了结果的类型。

这里有一个很好的阅读C# Debate: When Should You Use var?

这里是另一个C# 3.0 Tutorial

答案 4 :(得分:2)

var = programmer friendly = less typing =让你变得懒惰(另一种看待它的方式)=如果新的3.5 FW

,则会给代码带来模糊性

答案 5 :(得分:0)

它使您免于必须手动声明查询结果的确切类型。但我必须同情,这不是动态类型:productInfos变量将具有静态类型,但它是由编译器而不是您创建的。