【发布时间】:2018-03-06 11:44:14
【问题描述】:
使用 LINQ 我发现当 LINQ 表达式的结果具有接口类型时,这意味着它具有延迟执行。我说的对吗?
例如:
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5 };
// Deferred execution because res1 has an IEnumerable<int> type
var res1 = numbers.Where(x => x > 2);
// Immediate execution because res2 has an int[] type
var res2 = numbers.Where(x => x > 2).ToArray();
【问题讨论】:
-
更多的是“立即执行,因为您正在调用
ToArray”。IEnumerable<int> res3 = numbers.ToArray()将立即执行 -
这个粗略的假设很有可能是正确的,但它主要是一个实现细节。不要认为这是理所当然的。例如,如果
ToList()返回IList<T>,那么您仍然有一个接口,但它不会被延迟。它甚至并不总是有意义的,例如考虑Empty<T>()。 -
@Tim Schmelter 请给我一个例子
-
@HelloWorld:我给了
-
技术上甚至
var res2 = numbers.Where(x => x > 2).ToArray();使用延迟执行,但它真的无关紧要,因为它只是从From调用延迟到ToArray调用.延迟执行实际上可以在使用Expression或Delegate的任何地方进行。