C#中的延迟初始化(延迟加载)

最近一直在忙于找工作,很多编码工作都放下了。长沙这边找个.NET桌面开发还是有点困难。前不久卫宁健康的面试官电话面试,问了我一些问题,像StringBuilder和String的区别、托管内存到非托管内存的一些操作、WPF控件模版、触发器之类的。

大部分能回答上来,但这个延迟加载我只能说以前看过,没有具体用过,所以这里做个总结。

 

延迟初始化

当一个对象第一次被使用时才会创建,就叫延迟初始化。

 

延迟初始化的作用

延迟初始化的目的是为了提高性能、减少内存需求、避免一些不必要的计算。

 

延迟初始化的主要应用场景

1、当需要创建一个占用大量内存的对象并且程序可能不会使用它时。
例如,假设在内存中有一个 Customer 对象,该对象具有一个 Orders 属性,该属性包含一个大型 Order 对象数组,要对其进行初始化,需要一个数据库连接。如果用户从不要求显示订单或在计算中使用数据,则没有理由使用系统内存或计算周期来创建它。通过使用 Lazy<Orders> 声明 Orders 对象进行延迟初始化,可以避免在不使用该对象时浪费系统资源。

2、当需要创建成本很高的对象,并且希望把它的创建推迟到其它的关键操作完成之后。
例如,假设您的程序在启动时加载了多个对象实例,但只有其中一些是立即需要的。您可以通过将不需要的对象的初始化推迟到创建所需的对象来提高程序的启动性能。

 

System.Lazy<T>类

Lazy<T>提供对延迟初始化的支持。

 

基本使用

 

1 Lazy<ImageProc> imageProc = new Lazy<ImageProc>();

 

也可以在声明时传入一个Func<ImageProc>委托生成延迟初始化值

1 Lazy<ImageProc> imageProc = new Lazy<ImageProc>(() => new ImageProc());

 

说明:

在第一次访问Lazy变量的Value属性之前,不会创建ImageProc的实例。在第一次访问时,将创建并返回包装的类型,并将其存储以供将来进行任何访问。这也是延迟初始化的核心

 

总结:

延迟初始化还有一些复杂的使用,这里先不总结了。因为目前还没有正式的应用场景,只是面试被问到,所以查资料学习 一下。后续如果用到,再来补充这篇文章。

 

资料

https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization(MSDN上的Lazy Initialization)

posted @ 2021-07-09 09:23  zhaotianff  阅读(646)  评论(0编辑  收藏  举报