单例模式中的 双判断锁 问题、单例模式的资源问题, lazy<T> 懒加载
2026/8/7 18:00:33 网站建设 项目流程



》》》Lazy 不存在高并发问题,lazy已经解决了。

CLR 类执行的顺序

  1. 静态变量初始化 1次
  2. 静态构造函数 1次
  3. 实例变量初始化
  4. 基类静态变量初始化 1次
  5. 基类静态构造函数 1次
  6. 基类实例变量初始化
  7. 基类实例构造函数
  8. 实例构造函数
    》》》 创建单例模式 好多种
    1,静态类 方法 (静态类不能实现接口,不能继承,也不能被继承,不能有虚方法,抽象方法 静态类必须在第一次加载时初始化,如果项目中用不到会导致资源浪费;)
    2、静态属性、静态变量
    3、lock

lazy<T>


Lazy< T> 利用了 C# 的属性器和反射机制来实现延迟加载。当访问 Lazy< T> 的 Value 属性时,如果内部值尚未初始化,则初始化它。这个过程称为“lazy initialization”。Lazy< T> 提供了几种不同的线程安全模式,以适应不同的场景。

publicclassContainer:IContainer{publicstaticIContainerDefault{get;set;}=newLazy<Container>(),Value;}

Lazy 内部使用了一个委托,该委托负责创建目标对象。
当你第一次访问Lazy的Value属性时,
该委托会执行,实例化目标对象,并将其保存下来。随后的访问会直接返回已经创建好的对象,而不会再次执行委托。

Lazy<MyClass>lazyInstance=newLazy<MyClass>(()=>newMyClass());//简写 Lazy<MyClass> lazyInstance = new Lazy<MyClass>();MyClassmyObject=lazyInstance.Value;// 对象在第一次访问时创建


参考

参考

## lazy<T>基本用法 Lazy<T> 最基本的用法是,让 T 类型的无参构造函数来负责对象的创建// 假设这是一个创建开销很大的类publicclassBigResource{publicBigResource(){Console.WriteLine("BigResource 正在被创建...");// 模拟耗时操作,比如加载大量数据}publicvoidDoWork()=>Console.WriteLine("资源正在执行工作");}classProgram{staticvoidMain(){// 1. 创建 Lazy 容器,此时 BigResource 的实例并未真正创建Lazy<BigResource>lazyResource=newLazy<BigResource>();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){_connectionString=connectionString;Console.WriteLine($"数据库连接已建立:{_connectionString}");}publicvoidQuery()=>Console.WriteLine("执行数据库查询...");}// 在程序中使用stringconfig="Server=localhost;Database=MyDB;";Lazy<DatabaseConnection>lazyDb=newLazy<DatabaseConnection>(()=>{// 这里的逻辑只有在第一次访问 .Value 时才会执行Console.WriteLine("正在根据配置创建数据库连接...");returnnewDatabaseConnection(config);});// 此时数据库连接还未建立lazyDb.Value.Query();// 输出:// 正在根据配置创建数据库连接...// 数据库连接已建立: Server=localhost;Database=MyDB;// 执行数据库查询...

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询