C#——Lazy<T>懒加载机制

**懒加载机制是懒汉式单例模式(基于Lazy<T>实现),**这是一种线程安全、高性能且写法简洁的单例实现方式

创建文件DataCacheManager,用作单例文件,里面创建其他实例。

public class DataCacheManager

{

private static readonly Lazy<DataCacheManager> _instance = new Lazy<DataCacheManager>(() => new DataCacheManager());

public static DataCacheManager Instance => _instance.Value;

//又可以写做

// public static DataCacheManager Instance

// {

// get { return _instance.Value; }

// }

// 属性类型现在是public,和属性可访问性一致

public A.AClass AData { get; private set; }

public B.BClass BData { get; private set; }

public C.CClass CData { get; private set; }

private DataCacheManager() { }

public async Task<bool> LoadAllDataAsync()

{

try

{

await Task.Run(() =>

{

// 逐个加载并校验,定位哪个类加载失败

try

{

//创建实例1

A.Data = new A.AClass();

AData.AMethod();

}

catch (Exception ex)

{

throw new Exception("加载AData失败:" + ex.Message);

}

try

{

//创建实例2

BData = new B.BClass();

BData.BMethod();

}

catch (Exception ex)

{

throw new Exception("加载BData失败:" + ex.Message);

}

try

{

//创建实例3

CData = new C.CClass();

CData.CMethod();

}

catch (Exception ex)

{

throw new Exception("加载CData失败:" + ex.Message);

}

});

return true;

}

catch (Exception ex)

{

// 显示详细的加载失败原因,方便定位

MessageBox.Show($"数据加载失败:{ex.Message}\n{ex.StackTrace}", "加载错误");

// 清空缓存,避免后续使用脏数据

AData = null;

BData = null;

CData = null;

return false;

}

}

Lazy<T>是.NET 提供的懒加载类,它的特点是不会在程序启动或类加载时创建实例,而是在第一次访问Value属性时才创建实例(即 "懒加载",延迟初始化)。

_instance.Value的逻辑

  1. 第一次访问Instance时,_instance.Value会执行初始化委托(() => new DataCacheManager()),创建唯一的 DataCacheManager实例。
  2. 后续所有访问Instance的操作,都会直接返回第一次创建的那个实例,不会再新建(保证实例唯一性)。

() => new DataCacheManager(): 这是一个匿名委托(Lambda 表达式) ,它定义了Lazy<T>创建DataCacheManager实例的逻辑 ------ 调用DataCacheManager的私有构造函数(private DataCacheManager())创建实例。

当执行_instance.Value(return _instance.Value;)即Lazy<T>.Value,就会执行语句:new Lazy<DataCacheManager>(() => new DataCacheManager());

此时触发实例创建(首次访问时),返回T的实例(后续访问返回缓存的实例)

Lambda 表达式:() => new DataCacheManager()(调用DataCacheManager的私有构造函数,创建实例)。

调用该单例的函数:

public void Calculate()

{

// 仅获取缓存实例

var cache = DataCacheManager.Instance;

///

///业务逻辑

///

}

相关推荐
来自远方的老作者几秒前
第10章 面向对象-10.4 继承
开发语言·python·继承·单继承·多继承·super函数
逻辑驱动的ken2 分钟前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
小手cool4 分钟前
如何在Java中根据另一个配对集合对一个集合进行排序
java·开发语言
升鲜宝供应链及收银系统源代码服务9 分钟前
OMS 订单模块重构正式文档(一)---升鲜宝生鲜配送供应链管理系统
java·开发语言·重构·生鲜配送源代码·生鲜供应链源代码
qq_12084093711 小时前
Three.js 工程向:GLTFLoader 管线、Draco/KTX2 与资源管理
开发语言·javascript·ecmascript
下地种菜小叶1 小时前
定时任务系统怎么设计?一次讲清任务注册、分布式调度、幂等执行与失败补偿
java·开发语言·数据库·oracle·rabbitmq
csbysj20201 小时前
业务代表模式
开发语言
sghuter1 小时前
AI重塑工程师:未来核心能力全景图
开发语言·perl·composer·symfony
浪客川1 小时前
【百例RUST - 013】泛型
开发语言·后端·rust
iiiiyu2 小时前
常用API(SimpleDateFormat类 & Calendar类 & JDK8日期 时间 日期时间 & JDK8日期(时区) )
java·大数据·开发语言·数据结构·编程语言