我理解延迟执行在集合方面的一般概念,但是......在.NET的上下文中,与一遍又一遍地重建集合的相同元素有什么共同之处,从缓存中读取?延迟执行应该是关于延迟执行,直到它实际上是必要的,有时允许程序放弃填充集合中的后续元素(如果不需要它们)以及其他类似的优化。但是,请参考以下示例:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
IEnumerable<NestedType> tests = GetTestCases();
foreach (NestedType test in tests)
{
Console.WriteLine(test.Value);
test.Value = "x";
Console.WriteLine(test.Value);
}
foreach (NestedType test in tests)
{
Console.WriteLine(test.Value);
}
}
private static IEnumerable<NestedType> GetTestCases()
{
return new[] {"a", "b", "c"}.Select(x => new NestedType {Value = x});
}
private class NestedType
{
internal string Value { get; set; }
}
}
IEnumerable<NestedType>
返回的GenerateTests
正在使用延迟执行,但事实证明,这不仅意味着它在等待该集合中的元素被访问之后才运行lambda来计算它;它也意味着它正在运行lambda来重新计算并重新创建它已经过去的相同的元素。 (完全字面意义上的元素不同,但它们仍然在集合的“槽”中。)
这两个概念看起来非常分开。他们为什么这样拼凑?什么延迟执行函数直到它需要与拒绝从缓存中读取?即使还没有访问其他元素,为什么被访问的元素不能一致地存储在内部数组或其他内容中并重新读取?
这有什么优点/缺点,以及它如何影响.NET中的编码?