在 C# 中,ILazyEnumerable 是什么?请说明如何实现一个延迟初始化的集合,并解释其工作原理。
考察说明
考查对 C# 枚举器机制和延迟执行的理解,以及自定义延迟集合的实现能力。
回答思路
- 【回答框架 1】ILazyEnumerable 并非 .NET 标准接口,而是某些第三方库(如 LINQ to Objects 或自定义实现)中的概念,通常用于描述支持延迟执行的集合。标准 .NET 中对应的是 IEnumerable<T> 和 IEnumerator<T>,其核心是 MoveNext 和 Current。延迟初始化意味着元素在枚举时才产生,而非一次性加载全部数据。
- 【回答框架 2】实现延迟初始化的集合,核心是编写一个迭代器方法(使用 yield return),或者实现 IEnumerable<T> 和 IEnumerator<T>。迭代器方法中,代码在 MoveNext 时逐步执行,yield return 返回当前元素并暂停,直到下次 MoveNext。这样,每个元素在访问时才计算或获取,实现按需加载。
- 【回答框架 3】例如,一个返回斐波那契数列的迭代器方法:迭代时逐个生成数字,而不是预计算整个序列。对于数据源,如数据库查询,使用 yield return 可以将执行推迟到遍历时,避免一次性加载大量数据,减少内存占用。
- 【回答框架 4】需要注意,延迟执行并不意味着线程安全或缓存结果;每次 GetEnumerator 都会重新执行迭代器,如果迭代器有副作用或代价高,需考虑缓存。此外,如果集合需要多次遍历,延迟执行可能导致重复计算,必要时可强制物化(如 ToList 或 ToArray)。
- 【关键点 1】ILazyEnumerable 是延迟执行集合的泛称,核心是 IEnumerable<T> 和迭代器方法。
- 【关键点 2】实现方式:使用 yield return 编写迭代器方法,或手动实现 IEnumerator<T>。
- 【关键点 3】延迟初始化在枚举时执行,元素按需产生,可降低内存和启动开销。
- 【易错点 1】延迟执行不会自动缓存结果,多次枚举可能导致重复执行,可考虑物化。
- 【易错点 2】迭代器如果在枚举过程中修改集合,可能引发异常(如 List 的版本检查)。
- 【易错点 3】过度的延迟可能使错误延迟到运行时,增加排查难度。