C#面试题更新 2026-08-05

在 C# 中,Lazy<T> 类型的作用是什么?请说明它如何与集合(如 List<T> 或 Dictionary<TKey, TValue>)结合,以实现元素的延迟加载。

技术原理方案权衡C#

考察说明

考察对 C# 中 Lazy<T> 机制的理解及其在集合场景下的应用能力

回答思路

  1. 【回答框架 1】Lazy<T> 是 C# 提供的类型,用于实现线程安全的延迟初始化。它的核心思想是:对象的创建推迟到第一次访问 Value 属性时进行,并通过 LazyThreadSafetyMode 参数控制线程安全模式,默认是 ExecutionAndPublication,确保多线程环境下只有一个线程执行初始化。
  2. 【回答框架 2】与集合结合时,常见做法是将集合的元素类型设为 Lazy<T>。例如,List<Lazy<MyClass>> 或 Dictionary<string, Lazy<MyClass>>,这样每个元素在首次访问时才创建实例,避免一次性加载所有对象,从而提升启动性能或减少内存占用。
  3. 【回答框架 3】使用方式:在构造集合时,通过 lambda 表达式传入初始化逻辑,如 new Lazy<MyClass>(() => new MyClass())。访问元素时,通过 Value 属性触发实际创建,后续访问则返回缓存的实例。
  4. 【回答框架 4】延迟加载在集合中的典型应用场景包括:资源密集型对象(如数据库连接、文件流)、按需加载的大对象集合、以及需要分页或按访问模式加载的数据。但需注意,过度使用会增加复杂度和潜在的线程等待,需权衡性能收益。
  5. 【关键点 1】Lazy<T> 确保线程安全的延迟初始化,默认模式为 ExecutionAndPublication
  6. 【关键点 2】集合元素类型可设为 Lazy<T>,实现按需创建对象
  7. 【关键点 3】通过 Value 属性触发首次初始化,后续返回同一实例
  8. 【易错点 1】忽略线程安全模式可能导致性能下降或死锁风险
  9. 【易错点 2】过度使用延迟加载可能增加代码复杂度,且在多线程下访问频繁时效率反而降低