iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解C# Lazy Loading(延迟加载)
  • 513
分享到

详解C# Lazy Loading(延迟加载)

2024-04-02 19:04:59 513人浏览 安东尼
摘要

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

前言

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

常规有这些情况:

  • 对象创建成本高且程序可能不会使用它。 例如,假定内存中有具有 Orders 属性的 Customer 对象,该对象包含大量 Order 对象,初始化这些对象需要数据库连接。 如果用户永远不要求显示 Orders 或在计算中使用该数据,则无需使用系统内存或计算周期来创建它。 通过使用 Lazy 来声明 Orders对象用于迟缓初始化,可以避免在不使用该对象时浪费系统资源。
  • 对象创建成本高,且希望将其创建推迟到其他高成本操作完成后。 例如,假定程序在启动时加载多个对象实例,但是只需立即加载其中一部分。 可以通过推迟初始化不需要的对象,直到创建所需对象,提升程序的启动性能。(来源官方)

示例

创建用户类


 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 属性的第一个线程会为所有线程上的所有后续访问对其初始化,且所有线程共享相同的数据。 因此,哪个线程初始化对象并不重要,争用条件是良性的。


    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(懒加载)的详细内容,更多关于C# Lazy Loading(懒加载)的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解C# Lazy Loading(延迟加载)

本文链接: https://www.lsjlt.com/news/123529.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解C# Lazy Loading(延迟加载)
    目录前言示例参考:前言 按需加载对象延迟加载实际是推迟进行创建对象,直到对其调用后才进行创建初始化,延迟(懒加载)的好处是提高系统性能,避免不必要的计算以及不必要的资源浪费。 常规...
    99+
    2024-04-02
  • mybatis教程之延迟加载详解
    延迟加载1 使用延迟加载意义在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。&n...
    99+
    2023-05-31
    mybatis 延迟加载 batis
  • Java Spring @Lazy延迟注入源码案例详解
    前言 有时候我们会在属性注入的时候添加@Lazy注解实现延迟注入,今天咱们通过阅读源码来分析下原因 一、一个简单的小例子 代码如下: @Service public class ...
    99+
    2024-04-02
  • C#向数据库中插入或更新null空值与延迟加载lazy
    插入或更新null空值 一、在SQL语句中直接插入null或空字符串“” int item = null; item == null "null" : ...
    99+
    2024-04-02
  • C#使用Lazy<T>实现对客户订单的延迟加载
    "延迟加载"是指在需要的时候再加载数据。比如获得一个Customer信息,并不会把该Customer的Orders信息一下加载出来,当需要显示Orders的时候再...
    99+
    2024-04-02
  • PHP 延迟加载
    延迟加载简介 延迟加载是一种编程技术,它允许我们将资源的加载推迟到实际需要它们时。 这在处理大型或复杂的应用程序时特别有用,因为预先加载所有内容可能会导致加载时间缓慢和性能不佳。 在 PHP 中...
    99+
    2024-02-27
  • 解析Mybatis延迟加载问题
    延迟加载问题 MyBatis针对关联表中的数据支持延迟加载。延迟加载其实就是将数据加载时机推迟,比如推迟嵌套查询的执行时机。 延迟加载可以实现先查询主表,按需实时做关联查询,返回关联...
    99+
    2024-04-02
  • EntityFrameworkCore延迟加载(懒加载)用法
    众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载。不过现在EF Co...
    99+
    2024-04-02
  • 一文了解mybatis的延迟加载
    目录1. 什么时候会创建代理对象2. 如何使用3.延迟加载的好处本文主要介绍下mybatis的延迟加载,从原理上介绍下怎么使用、有什么好处能规避什么问题。延迟加载一般用于级联查询(级...
    99+
    2024-04-02
  • Hibernae的延迟加载如何理解
    今天给大家介绍一下Hibernae的延迟加载如何理解。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。Hibernae 的延迟加载是一个非常常用的技术,实体的集合...
    99+
    2023-06-17
  • MyBatis 延迟加载、一级缓存、二级缓存(详解)
    使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载、一级缓存、二级缓存。使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能。一...
    99+
    2023-05-31
    一级缓存 二级缓存 mybatis
  • MyBatis的⾼级映射及延迟加载过程详解
    目录一:MyBatis的⾼级映射及延迟加载1. 多对⼀第⼀种⽅式:级联属性映射第⼆种⽅式:association标签第三种⽅式:分步查询2. 多对⼀延迟加载3.&...
    99+
    2023-02-08
    MyBatis延迟加载 MyBatis⾼级映射
  • Linq如何实现延迟加载
    小编给大家分享一下Linq如何实现延迟加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linq延迟加载在查询某对象时,实际上你只查询该对象。不会同时自动获取这个...
    99+
    2023-06-17
  • C++实现延迟的方法详解
    目录1、stl方式2、用boost实现, 没有用过3、sleep知识补充1、stl方式 std::this_thread::sleep_for(std::chrono::millis...
    99+
    2022-12-27
    C++实现延迟 C++延迟
  • C#在MEF框架中实现延迟加载部件
    在MEF的宿主中,当我们通过Import声明导入的对象时,组装(Compose)的时候会创建该对象。例如: interface ILogger { v...
    99+
    2024-04-02
  • MyBatis延迟加载与立即加载案例教程
    MyBatis入门-延迟加载与立即加载 加载策略 延迟加载 延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些...
    99+
    2024-04-02
  • Hibernate延迟加载机制是什么
    本篇内容主要讲解“Hibernate延迟加载机制是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Hibernate延迟加载机制是什么”吧!延迟加载机制是为了避免一些无谓的性能开销而提出来的,...
    99+
    2023-06-17
  • Hibernate延迟加载技术是什么
    这篇文章主要讲解了“Hibernate延迟加载技术是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate延迟加载技术是什么”吧!Hibernate延迟加载的对象:◆hiber...
    99+
    2023-06-17
  • springboot jpa 延迟加载问题的2种解决
    springboot jpa 延迟加载问题 在springboot中,在application.properties的配置文件中新增spring.jpa.open-in-view=t...
    99+
    2024-04-02
  • MyBatis延迟加载策略深入探究
    目录分步查询的优点在主配置文件当中设置延迟加载在studentDao.xml当中设置分步查询测试结果如何使用延迟加载的好处有两种写法来表示查询信息,分别是链表查询和分步查询的方法。那...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作