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;

///

///业务逻辑

///

}

相关推荐
chao1898446 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
赏金术士6 小时前
Kotlin 习题集 · 高级篇
android·开发语言·kotlin
楼兰公子7 小时前
buildroot 在编译rust时裁剪平台类型数量的方法
开发语言·后端·rust
吴声子夜歌8 小时前
Go——并发编程
开发语言·后端·golang
ooseabiscuit8 小时前
Laravel4.x:现代PHP框架的奠基之作
java·开发语言·php
c1s2d3n4cs9 小时前
Qt模仿nlohmann::json进行序列化和反序列化
开发语言·qt·json
没什么本事9 小时前
关于C# panel 添加lable问题 -- 明确X和Y 位置错误
android·java·c#
AiTop1009 小时前
Claude Code 推出 Agent View:命令行编程正式进入“多线程并发“时代
开发语言·人工智能·ai·aigc
jf加菲猫9 小时前
第21章 Qt WebEngine
开发语言·c++·qt·ui
码农-阿杰10 小时前
深入理解 synchronized 底层实现:从 HotSpot C++ 源码看对象锁与 Monitor 机制
开发语言·c++·