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;

///

///业务逻辑

///

}

相关推荐
汤姆yu17 分钟前
基于python大数据的高校舆情监测系统的设计与实现
大数据·开发语言·python·分享·分析·舆情
Cory.眼22 分钟前
Python爬虫实战:从入门到进阶
开发语言·爬虫·python
qq_5896660531 分钟前
Java继承
java·开发语言
八角.。42 分钟前
面向对象-多态
java·开发语言
@卓越俊逸_角立杰出@1 小时前
快速学会 Java 实现意图识别:从规则匹配到 BiLSTM 分类器
java·开发语言·人工智能
吴可可1231 小时前
C#重写机制与CAD图元开发要点
c#
小小龙学IT1 小时前
simdjson:利用 SIMD 指令实现 GB/s 级 JSON 解析的 C++ 开源库
开发语言·c++·json
A_nanda1 小时前
c#WPF开发常见问题
开发语言·c#·wpf
唐青枫1 小时前
别只会解析参数:C#.NET Spectre.Console.Cli 命令行工具实战详解
c#·.net
Hello.Reader1 小时前
REALITY 技术深度解析从 TLS 伪装、抗主动探测到 VLESS + XTLS Vision 完整实践
开发语言·php