C#Lazy

news/2025/11/18 13:56:42/文章来源:https://www.cnblogs.com/JiaYuBaoBao/p/19237128

Lazy<T>是一个用于实现延迟初始化(Lazy Initialization)的泛型类,它可以将昂贵对象的创建推迟到第一次实际使用时。这种模式能有效提升应用程序的启动性能和资源利用率。

💡 核心概念与价值

Lazy<T>的核心思想是“按需创建”。它特别适用于以下场景:

  • 资源密集型对象:创建成本高、耗时长的对象,如加载大型文件、建立数据库连接或进行复杂计算。

  • 可能不被使用的对象:某些功能或组件在程序运行过程中可能根本不会被访问,使用 Lazy<T>可以避免不必要的初始化开销。

  • 提升启动速度:通过将非核心资源的初始化后移,让应用程序更快启动。

 

使用Lazy<T>时,需要注意以下几点:

  1. 线程安全:Lazy<T>默认是线程安全的,可以在多线程环境下使用,确保只有一个线程可以初始化实例。

  2. 初始化方式:可以通过传递一个委托来自定义初始化过程,如果不传递,则使用类型的默认构造函数。

  3. 异常处理:如果初始化过程中出现异常,则每次访问Value属性时都会抛出异常,除非重新初始化。

🛠️ 基本用法与示例

使用 Lazy<T>非常简单,其核心是通过访问 Value属性来触发初始化。

// 1. 基本用法:使用类型的默认构造函数
Lazy<ExpensiveObject> lazyObject1 = new Lazy<ExpensiveObject>();
// 在访问 Value 属性之前,ExpensiveObject 并不会被创建
ExpensiveObject obj1 = lazyObject1.Value;// 2. 使用委托自定义初始化逻辑
Lazy<ExpensiveObject> lazyObject2 = new Lazy<ExpensiveObject>(() => 
{// 这里可以编写复杂的初始化代码return new ExpensiveObject("自定义参数");
});ExpensiveObject obj2 = lazyObject2.Value;

 示例:模拟一个初始化昂贵的对象

public class ExpensiveService
{public ExpensiveService(){Console.WriteLine(">>> ExpensiveService 被创建了!这个过程很耗时...");// 模拟昂贵的初始化操作,如读取大文件或连接数据库Thread.Sleep(2000); }public void DoWork() => Console.WriteLine("正在工作...");
}class Program
{static void Main(){Console.WriteLine("程序开始...");// 创建 Lazy 实例,但昂贵的对象尚未初始化Lazy<ExpensiveService> lazyService = new Lazy<ExpensiveService>();Console.WriteLine("Lazy 对象已创建,但 ExpensiveService 还未初始化。");// 第一次访问 .Value 属性,触发实际创建Console.WriteLine("首次访问 lazyService.Value...");lazyService.Value.DoWork(); // 此时会看到构造函数中的输出// 后续访问将直接返回已创建好的实例,不会再次初始化Console.WriteLine("再次访问 lazyService.Value...");lazyService.Value.DoWork();}
}

 输出结果:

程序开始...
Lazy 对象已创建,但 ExpensiveService 还未初始化。
首次访问 lazyService.Value...
>>> ExpensiveService 被创建了!这个过程很耗时...
正在工作...
再次访问 lazyService.Value...
正在工作...

 从输出可以看出,ExpensiveService的构造函数只在第一次访问 .Value时被调用了一次。

 

🔒 线程安全模式

Lazy<T>的一个重要优势是内置了对多线程环境的支持。你可以通过 LazyThreadSafetyMode枚举来指定不同的线程安全行为。

// 1. ExecutionAndPublication (默认模式,最安全)
// 确保只有一个线程能执行初始化,初始化后所有线程都看到同一个实例。
Lazy<ExpensiveObject> safeLazy = new Lazy<ExpensiveObject>(() => new ExpensiveObject(),LazyThreadSafetyMode.ExecutionAndPublication
);// 2. PublicationOnly
// 允许多个线程同时执行初始化,但只采用第一个成功初始化的结果,适合初始化成本极高且可接受短暂资源浪费的场景。
Lazy<ExpensiveObject> publicationLazy = new Lazy<ExpensiveObject>(() => new ExpensiveObject(),LazyThreadSafetyMode.PublicationOnly
);// 3. None
// 非线程安全,性能最高,但仅适用于单线程环境。
Lazy<ExpensiveObject> unsafeLazy = new Lazy<ExpensiveObject>(() => new ExpensiveObject(),LazyThreadSafetyMode.None
);

📚 实际应用场景

  1. 实现单例模式(Singleton)

    这是 Lazy<T>最经典的应用之一,它能以简洁且线程安全的方式实现延迟加载的单例。

    public sealed class Singleton
    {// 私有构造函数private Singleton() { }// 使用 Lazy<T> 包裹单例实例private static readonly Lazy<Singleton> _instance =new Lazy<Singleton>(() => new Singleton());// 公共访问点public static Singleton Instance => _instance.Value;
    }

     

  2. 延迟加载资源

    对于如图片、音频、视频等大型资源,可以使用 Lazy<T>确保只在需要时才加载。

    public class ImageLoader
    {private Lazy<Bitmap> _lazyImage = new Lazy<Bitmap>(() => (Bitmap)Image.FromFile("path/to/large_image.jpg"));public Bitmap GetImage() => _lazyImage.Value;
    }

     

  3. 在依赖注入中使用

    在现代应用开发中,依赖注入容器也广泛利用延迟加载来优化服务启动时间。

  4. ⚠️ 注意事项与最佳实践

    • 异常处理:如果初始化委托(valueFactory)中抛出异常,Lazy<T>会缓存这个异常。之后每次访问 Value属性都会再次抛出相同的异常。因此,务必确保初始化逻辑的健壮性,或在委托内进行适当的异常处理。

    • 避免过度使用:只有在对象确实创建昂贵或可能不被使用时才考虑使用 Lazy<T>。不必要的包装会增加代码复杂性并带来微小的性能开销。

    • 检查是否已初始化:可以通过 IsValueCreated属性来检查对象是否已经被初始化,这在某些调试或特定逻辑中很有用。

    • if (lazyObject.IsValueCreated)
      {Console.WriteLine("对象已经初始化了。");
      }

       

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/968924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加氢站安全监测选型:别让传感器成为你的定时炸弹

2025年3月,江苏某加氢站因传感器误报导致全站紧急关停,直接损失超50万元;同年5月,浙江某站点却创造了连续2年零故障的行业纪录——同样的氢能风口,截然不同的安全结局。这背后藏着一个被90%采购者忽视的真相:加氢…

linux anaconda

Anaconda 是一个由 Anaconda, Inc. 开发的开源 Python 发环境和包管理系统,主要用于在 Linux、MacOS 和 Windows 上安装和管理 Python 环境。它特别适合用于科学计算、数据科学、机器学习等场景。 一、Anaconda 在 Li…

服务器接口调用微信小程序获取手机号接口报:The SSL connection could not be established, see inner exception.

使用了linux服务器,发布.net8的webapi,其中登录接口调用了微信小程序获取手机号的接口,本地测试环境一直没有问题,当发布到服务器之后一直报:The SSL connection could not be established, see inner exception.…

事倍功半是蠢蛋62 docker 语句儿生产力

docker compose restart backend git stash git pull git stash pop

ExportExcel-AnnotationList-反射

-------------------------------------------------------------------------------------------------------- 这段代码用于通过自定义的 ExportExcel 工具类生成 Excel 文件并写入输出流,主要功能是导出案件信息数…

【重磅升级!迅为iTOP-Hi3403开发板SDK全面升级至Linux 6.6内核】

【重磅升级!迅为iTOP-Hi3403开发板SDK全面升级至Linux 6.6内核】重磅升级!迅为iTOP-Hi3403开发板SDK全面升级至Linux 6.6内核各位开发者朋友们,大家好! 亲爱的开发者们,好消息来啦!迅为电子始终走在技术前沿,现…

2025留学美国被开除怎么办?申诉挽回/学业急救/身份保留/转学规划/签证补救机构哪家强

2025留学美国被开除怎么办?申诉挽回/学业急救/身份保留/转学规划/签证补救机构哪家强随着赴美留学人数的持续攀升,学术诚信审核严格、GPA不达标、出勤异常等问题导致的留学生被开除情况也日益增多。美国留学被开除不…

2025年国内档案馆展示柜厂家综合实力排行榜TOP10

摘要 随着文博行业的快速发展,档案馆展示柜作为文物保护和展示的重要载体,其市场需求持续增长。2025年,行业内涌现出一批技术实力雄厚、服务质量优秀的厂家。本文基于市场调研和用户反馈,为您精选十家值得信赖的档…

2025年陕西省探矿权采矿权技术服务企业权威推荐榜单

摘要 随着矿产资源管理的日益规范,陕西省探矿权采矿权技术服务行业在2025年迎来了快速发展,专业服务机构在土地审批、矿产开发等领域发挥关键作用。本文基于行业数据和用户口碑,综合评测排名前十的服务提供商,为有…

WPS用Qt还情有可原

百度网盘APP应该用本地HTTPS服务器+Web么。 本地HTTPS服务器里可以爱干啥干啥么。/opt/baidunetdisk$ l 总计 230M -rwxr-xr-x 1 root root 128M 2023年 1月19日 baidunetdisk -rw-rw-r-- 1 root root 1.9K 2023年 1月…

2025年山西口碑好的纪念馆展示柜厂家十大排名权威推荐

摘要 随着文博产业的快速发展,纪念馆展示柜行业迎来新一轮技术升级与市场需求增长。2025年,山西地区纪念馆展示柜厂家在技术创新、工艺品质和服务体系等方面展现出强劲竞争力。本文基于行业数据、用户口碑和技术参数…

2025年评价高的UV 软膜广告灯箱厂家最新TOP排行

2025年评价高的UV软膜广告灯箱厂家最新TOP实力排行行业背景与市场趋势UV软膜广告灯箱作为现代商业展示的重要载体,近年来在户外广告、商场导视、品牌展示等领域应用广泛。根据《2024-2025年中国广告标识行业白皮书》数…

2025年山西口碑好的纪念馆展示柜定制厂家排行Top10推荐

摘要 纪念馆展示柜行业在2025年迎来快速发展,随着文化强国战略的推进,山西及国内文博场馆对高品质展示柜需求激增。本文基于行业数据与用户口碑,精选排名前十的厂家,为采购决策提供参考。摘要部分包含行业发展概述…

C# 14 新功能全面解析:提升生产力与性能的革命性更新

引言 C# 语言作为.NET生态的核心,始终致力于提升开发者的生产力与应用程序性能。C# 14带来了多项突破性特性,包括扩展成员、字段关键词、空条件赋值等,这些改进显著减少了样板代码,增强了类型系统的灵活性。本文将…

【隐语SecretFlow隐私计算】如何使用 Kuscia API 运行一个 SecretFlow Serving

打开链接点亮社区Star,照亮技术的前进之路。每一个点赞,都是社区技术大佬前进的动力Github 地址: https://github.com/orgs/secretflow/repositories?q=sort%3Astars本教程将以 SecretFlow Serving 内置测试模型为…

2025年优秀的软件行业体系认证三体系认证品牌实力推荐榜

2025年优秀的软件行业体系认证三体系认证品牌实力推荐榜行业背景与市场趋势随着数字化转型浪潮席卷全球,软件行业作为数字经济的基础设施,其质量管理和标准化建设日益受到重视。根据国际标准化组织(ISO)最新发布的《…

2025年11月道德经讲师推荐榜单:五位讲师详细对比与评价

作为一位希望深入学习《道德经》的读者或企业培训负责人,您可能正在寻找一位能够将古老智慧与现代实践相结合的讲师。无论是用于个人修养提升、企业内部文化建设,还是特定行业协会的专题讲座,选择一位合适的讲师至关…

linux ajax

您提到的“Linux Ajax”可能是一个术语或概念的混淆,因为 Ajax 是一种前端技术(Javascript 的异步请求库),与 Linux 操作系统本身并无直接关联。 如果您是想了解 Linux 中的 Ajax 技术 或 Linux 与 Ajax 的结合使用…

linux adobe reader

Adobe Reader 是一款由 Adobe 开发的 PDF 阅读器,主要用于查看、注释、打印和编辑 PDF 文件。在 Linux 系统中,Adobe Reader 不是原生安装的,需要通过第三方软件包或从 Adobe 官方下载安装。 一、在 Linux 上安装 A…