资讯动态

单例模式中的 双判断锁 问题、单例模式的资源问题, lazy<T> 懒加载

发布时间:2026/8/7 18:00:38 来源:尧图企业网站定制
》》》Lazy 不存在高并发问题lazy已经解决了。CLR 类执行的顺序静态变量初始化 1次静态构造函数 1次实例变量初始化基类静态变量初始化 1次基类静态构造函数 1次基类实例变量初始化基类实例构造函数实例构造函数》》》 创建单例模式 好多种1静态类 方法 静态类不能实现接口不能继承也不能被继承不能有虚方法抽象方法 静态类必须在第一次加载时初始化如果项目中用不到会导致资源浪费2、静态属性、静态变量3、locklazyTLazy T 利用了 C# 的属性器和反射机制来实现延迟加载。当访问 Lazy T 的 Value 属性时如果内部值尚未初始化则初始化它。这个过程称为“lazy initialization”。Lazy T 提供了几种不同的线程安全模式以适应不同的场景。publicclassContainer:IContainer{publicstaticIContainerDefault{get;set;}newLazyContainer(),Value;}Lazy 内部使用了一个委托该委托负责创建目标对象。当你第一次访问Lazy的Value属性时该委托会执行实例化目标对象并将其保存下来。随后的访问会直接返回已经创建好的对象而不会再次执行委托。LazyMyClasslazyInstancenewLazyMyClass(()newMyClass());//简写 LazyMyClass lazyInstance new LazyMyClass();MyClassmyObjectlazyInstance.Value;// 对象在第一次访问时创建参考参考## lazyT基本用法 LazyT 最基本的用法是让 T 类型的无参构造函数来负责对象的创建// 假设这是一个创建开销很大的类publicclassBigResource{publicBigResource(){Console.WriteLine(BigResource 正在被创建...);// 模拟耗时操作比如加载大量数据}publicvoidDoWork()Console.WriteLine(资源正在执行工作);}classProgram{staticvoidMain(){// 1. 创建 Lazy 容器此时 BigResource 的实例并未真正创建LazyBigResourcelazyResourcenewLazyBigResource();Console.WriteLine($资源是否已创建{lazyResource.IsValueCreated});// 输出: False// 2. 首次访问 Value 属性触发 BigResource 的构造函数Console.WriteLine(准备使用资源...);lazyResource.Value.DoWork();// 控制台输出:// 准备使用资源...// BigResource 正在被创建...// 资源正在执行工作// 3. 再次访问直接使用已创建好的实例不会再次初始化Console.WriteLine($资源是否已创建{lazyResource.IsValueCreated});// 输出: TruelazyResource.Value.DoWork();// 控制台输出:// 资源正在执行工作}}### 高级用法自定义初始化逻辑 如果对象的创建不是简单地调用无参构造函数你可以通过委托来指定初始化逻辑// 假设这个类需要一个 id 来初始化publicclassDatabaseConnection{privatestring_connectionString;publicDatabaseConnection(stringconnectionString){_connectionStringconnectionString;Console.WriteLine($数据库连接已建立:{_connectionString});}publicvoidQuery()Console.WriteLine(执行数据库查询...);}// 在程序中使用stringconfigServerlocalhost;DatabaseMyDB;;LazyDatabaseConnectionlazyDbnewLazyDatabaseConnection((){// 这里的逻辑只有在第一次访问 .Value 时才会执行Console.WriteLine(正在根据配置创建数据库连接...);returnnewDatabaseConnection(config);});// 此时数据库连接还未建立lazyDb.Value.Query();// 输出:// 正在根据配置创建数据库连接...// 数据库连接已建立: Serverlocalhost;DatabaseMyDB;// 执行数据库查询...

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价