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;

///

///业务逻辑

///

}

相关推荐
zhangjw3418 小时前
Java基础语法:变量、数据类型与运算符,从原理到实战
java·开发语言
yaoxin52112321 小时前
384. Java IO API - Java 文件复制工具:Copy 示例完整解析
java·开发语言·python
NotFound4861 天前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
Ava的硅谷新视界1 天前
用了一天 Claude Opus 4.7,聊几点真实感受
开发语言·后端·编程
rabbit_pro1 天前
Python调用onnx模型
开发语言·python
浪客川1 天前
【百例RUST - 010】字符串
开发语言·后端·rust
赵侃侃爱分享1 天前
学完Python第一次写程序写了这个简单的计算器
开发语言·python
断眉的派大星1 天前
# Python 魔术方法(魔法方法)超详细讲解
开发语言·python
2501_933329551 天前
技术深度拆解:Infoseek舆情处置系统的全链路架构与核心实现
开发语言·人工智能·自然语言处理·架构
妮妮喔妮1 天前
supabase的webhook报错
开发语言·前端·javascript