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;

///

///业务逻辑

///

}

相关推荐
毕设源码-邱学长18 小时前
【开题答辩全过程】以 基于PHP的发热病人管理平台的设计与实现为例,包含答辩的问题和答案
开发语言·php
HellowAmy18 小时前
我的C++规范 - 线程池
开发语言·c++·代码规范
独自破碎E18 小时前
【BISHI9】田忌赛马
android·java·开发语言
czy878747518 小时前
const 在 C/C++ 中的全面用法(C/C++ 差异+核心场景+实战示例)
c语言·开发语言·c++
范纹杉想快点毕业18 小时前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
马猴烧酒.19 小时前
【面试八股|Java集合】Java集合常考面试题详解
java·开发语言·python·面试·八股
以卿a19 小时前
C++(继承)
开发语言·c++·算法
lly20240619 小时前
XQuery 选择和过滤
开发语言
测试工程师成长之路19 小时前
Serenity BDD 框架:Java + Selenium 全面指南(2026 最新)
java·开发语言·selenium
czxyvX20 小时前
017-AVL树(C++实现)
开发语言·数据结构·c++