前言

按需加载对象延迟加载实际是推迟进行创建对象,直到对其调用后才进行创建初始化,延迟(懒加载)的好处是提高系统性能,避免不必要的计算以及不必要的资源浪费。

常规有这些情况:

  • 对象创建成本高且程序可能不会使用它。例如,假定内存中有具有 Orders 属性的 Customer 对象,该对象包含大量 Order 对象,初始化这些对象需要数据库连接。如果用户永远不要求显示 Orders 或在计算中使用该数据,则无需使用系统内存或计算周期来创建它。通过使用 Lazy

    来声明 Orders对象用于迟缓初始化,可以避免在不使用该对象时浪费系统资源。

  • 对象创建成本高,且希望将其创建推迟到其他高成本操作完成后。例如,假定程序在启动时加载多个对象实例,但是只需立即加载其中一部分。可以通过推迟初始化不需要的对象,直到创建所需对象,提升程序的启动性能。(来源官方)

示例

创建用户类

Copy
 public class User    {        public string Name { get; set; }

        public int Age { get; set; }

        public User() {            this.Name = "Name";            this.Age = 0;        }    }

默认情况下,Lazy 对象是线程安全的。也就是说,如果构造函数没有指定线程安全性的类型,该函数创建的 Lazy 对象是线程安全的。在多线程方案中,访问线程安全 Lazy 对象的 Value 属性的第一个线程会为所有线程上的所有后续访问对其初始化,且所有线程共享相同的数据。因此,哪个线程初始化对象并不重要,争用条件是良性的。

Copy
    class Program    {        static void Main(string[] args)        {            Lazy<User> user = new Lazy<User>();            ThreadLocal<User> threadLocal = new ThreadLocal<User>();

            if (!user.IsValueCreated)                Console.WriteLine("The object is not initialized");            Console.WriteLine(user.Value.Name);            user.Value.Name = "Name1";            user.Value.Age = 1;            Console.WriteLine(user.Value.Name);            Console.Read();        }    }

对象的线程安全性 LazyThreadSafetyMode mode 参数 布尔 isThreadSafe 参数 没有线程安全性参数
完全线程安全;一次只有一个线程尝试初始化值。 ExecutionAndPublication true 可以。
非线程安全。 None false 不适用。
完全线程安全;线程争用以初始化值。 PublicationOnly 不适用。 不适用。

其中IsValueCreated属性是个Boolean类型,我们可以通过此属性去确定当前对象有没有被初始化

调用后,进行了创建操作

再说说Lazy中几个构造函数,

  • public Lazy (bool isThreadSafe)
    isThreadSafe 的布尔参数,该方法参数用于指定是否从多线程访问 Value 属性。如果想要仅从一个线程访问属性,则传入 false 以获取适度的性能优势。如果想要从多线程访问属性,则传入 true 以指示 Lazy 实例正确处理争用条件(初始化时一个线程引发异常)。

  • public Lazy (LazyThreadSafetyMode mode):提供线程安全模式。

  • public Lazy (Func valueFactory)
    lambda 表达式传递给新的 Lazy 对象的构造函数。下一次访问 Value 属性将导致新 Lazy 的初始化,并且其 Value 属性此后会返回已分配给该属性的新值。

总结

参考:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization

C# Lazy Loading相关推荐

  1. iOS swift lazy loading

    Why bother lazy loading and purging pages, you ask? Well, in this example, it won't matter too much ...

  2. 【Vue Laravel-mix】Error with Vue lazy loading components: “Failed to resolve async component“

    [Vue Laravel-mix] 报错信息: Error with Vue lazy loading components: "Failed to resolve async compon ...

  3. 将图片显示在应用最上层_谷歌Chrome 75将原生支持lazy loading,动动手也可以抢先试玩...

    不少网站都会在网页当中埋入延迟加载的JavaScript代码,以便降低首次加载的图片数量,加快网页首次呈现时间.Google Chrome已预定在75版本当中原生支持这项功能并自动启动,包含lazy ...

  4. 运行Xcode时出现 Lazy loading NSBundle MobileCoreServices.framework和 Loaded MobileCoreServices.framework

    运行Xcode时出现 Lazy loading NSBundle MobileCoreServices.framework和 Loaded MobileCoreServices.framework 解 ...

  5. EFCore Lazy Loading + Inheritance = 干净的数据表 (二)

    前言 本篇是上一篇EFCore Lazy Loading + Inheritance = 干净的数据表 (一) [献给处女座的DB First程序猿] 前菜 的续篇.这一篇才是真的为处女座的DB Fi ...

  6. EFCore Lazy Loading + Inheritance = 干净的数据表 (一)

    前言 α角 与 β角 关于α角 与 β角的介绍,请见上文 如何用EFCore Lazy Loading实现Entity Split. 本篇会继续有关于β角的彩蛋在等着大家去发掘./斜眼笑 其他 本篇的 ...

  7. 如何用EFCore Lazy Loading实现Entity Split

    α角 与 β角 支持 现实生活 的 计算机系统,总有着两大偏差,第一个是 现实生活 与 计算机系统 的α角,另外一个是计算机系统的 逻辑设计 与 物理设计 的β角.举个栗子: α角:假设某个公司的商业 ...

  8. 深入了解EntityFramework——Lazy Loading与Eager Loading

    Lazy Loading:延迟加载.Eager Loading:贪婪加载. 首先通过一个简单的控制台应用程序例子说明延迟加载: 订单主表和订单从表,并且订单主表和订单从表是一对多的关系,代码如下图所示 ...

  9. ### Cause: java.lang.IllegalStateException: Cannot enable lazy loading because Javassist is not avai

    起因 下载阅读mybatis-3.5.7源码,debug时报错如下信息 org.apache.ibatis.exceptions.PersistenceException: ### Error bui ...

  10. Lazy loading

    Refer to http://www.cnblogs.com/liubiaocai/archive/2011/09/12/2173991.html 1.NH的延迟加载的意思就是:你访问了属性(就是点 ...

最新文章

  1. ML之nyoka:基于nyoka库利用LGBMClassifier模型实现对iris数据集训练、保存为pmml模型并重新载入pmml模型进而实现推理
  2. 怎么查看python是否安装好了pyinstaller_Python PyInstaller安装和使用教程(详解版)...
  3. 小心!你家的 IoT 设备可能已成为僵尸网络“肉鸡”
  4. lombok在IntelliJ IDEA下的使用
  5. 在mysql支持关系模型中_MySQL支持关系模型中、和三种不同的完整性约束
  6. Pdftk - The PDF Toolkit
  7. IOS开发~GCD--讲的巨详细,而且还有例子工程
  8. 大白话聊聊Java并发面试问题之Java 8如何优化CAS性能?
  9. DNS 攻击方式及攻击案例
  10. 读书笔记-人月神话8
  11. win7计算机扫描仪,win7系统怎么用打印机扫描仪功能|win7系统扫描仪功能的使用方法...
  12. java中的Cipher类
  13. 华为 Mate8 Emui 5.0 安卓 7.0 root 记录
  14. 12种mysql常见错误总结 +分析示例
  15. cerebro 配置
  16. gpu版本pytorch配置
  17. Unity 2018之ShaderGraph使用基础
  18. 计算机这一门在高考里占分吗,2018高考各科答题要点 从答题规范上“要分”
  19. Spring Cloud 笔记
  20. 青龙跑甜糖,跑中青等等?

热门文章

  1. 闲谈简单设计(KISS)疑惑
  2. 《Starting with Starling》 Ep 1~11
  3. imessage_如何在所有Apple设备上同步您的iMessage
  4. 如何在Android主屏幕上添加热点快捷方式
  5. safari 获取视频流_如何在Safari中将RSS feed和社交媒体合并为一个流
  6. 后缀的形容词_构词法(18)构成形容词的常见后缀 3
  7. python UDP-数据报协议
  8. Nginx图片剪裁模块探究 http_image_filter_module
  9. Highcharts数据表示(3)
  10. Swoole入门指南:PHP7安装Swoole详细教程(一)