IEnumerable或var

时间:2011-08-14 14:10:51

标签: c# linq

  

可能重复:
  C# 'var' vs specific type performance

在性能方面,在linq中使用var或IEnumerable会有什么不同吗? IEnumerable或IQueryable怎么样?我们怎么知道哪一个是IEnumerable,哪一个是IQueryable? 例如:在下面的代码中

 IEnumerable<CaseTable> test = from x in dataBase.CaseTables
                               where x.case_id.Equals("12")
                               select x;

4 个答案:

答案 0 :(得分:7)

如果返回类型不相同,那将会产生影响,然后这会改变构图。例如:

IEnumerable<Users> users = db.Users;
var count = users.Count();

var users = db.Users;
var count = users.Count();

如果这实际上是数据库提供者,则第二个应该发出&#34;从用户&#34;中选择COUNT(1)。 (1行,1列) - 但是,第一行将发出&#34; select * from Users&#34; - n列乘以m行。它将通过网络拖动数据,将其实现为对象,然后(LINQ-to-Objects)计算对象。

如果它已经已经 IEnumerable<T>那么它将没有任何区别。

了解它是什么 - 悬停;)或更好:使用分析器(例如mvc-mini-profiler),以便您可以随时密切关注它正在运行的查询。

答案 1 :(得分:4)

var只是程序员的语法 - 它根本不会改变语义。如果您声明为var,则示例中的测试类型仍为IEnumerable<CaseTable>

至于它是IEnumerable还是IQueryable - 这取决于dataBase.CaseTables的类型

答案 2 :(得分:3)

如果右侧的表达式类型不是var,则使用IEnumerable<T>代替IEnumerable<T>可能会产生性能差异。

在上面的代码中(假设dataBase.CaseTablesIQueryable<CaseTable>由LINQ to SQL或类似的提供程序支持),如果您编写了test.First(),则可以从数据库中检索大量行只获得第一个。

如果您使用varIQueryable<CaseTable>,则只会检索第一行。

即使没有IQueryable<T>,这也会有所不同。例如,List<T>.GetEnumerator()会返回自定义struct。迭代使用它比迭代IEnumerator<T>要快。虽然在大多数情况下差异可以忽略不计。

这一切意味着什么:是的,使用var可能会有所不同:它可以使您的代码更快,在某些情况下更多更快。

答案 3 :(得分:2)

关键字“var”只是C#中的语法糖。由它声明的变量仍然是静态类型的,编译器将推断其类型。

Type obj = new Type() and var obj = new Type() are the same.
当变量的类型从其声明中显而易见时,“var”对于使代码不那么臃肿是有用的。当你想要发现一个不那么明显的变量类型(通过IntelliSense)时,它也非常好 - “LINQ”会响起一些响铃。

当然,限制适用于何时可以使用'var'。看看here