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

作者:HueiFeng 时间:2021-09-02 03:02:58 

目录
  • 前言

  • 示例

  • 参考:

前言

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

常规有这些情况:

  • 对象创建成本高且程序可能不会使用它。 例如,假定内存中有具有 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 参数没有线程安全性参数
完全线程安全;一次只有一个线程尝试初始化值。ExecutionAndPublicationtrue可以。
非线程安全。Nonefalse不适用。
完全线程安全;线程争用以初始化值。PublicationOnly不适用。不适用。

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

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

调用后,进行了创建操作

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

再说说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

来源:https://www.cnblogs.com/yyfh/p/11996509.html

标签:C#,Lazy,Loading,延迟加载
0
投稿

猜你喜欢

  • C#结束进程及子进程

    2021-06-22 15:18:10
  • 模拟按Home键退出应用的简单方法(分享)

    2023-10-30 20:02:36
  • Java实现新建有返回值的线程的示例详解

    2022-02-13 17:09:33
  • 使用Java和WebSocket实现网页聊天室实例代码

    2023-11-26 00:16:02
  • Java基于对象流实现银行系统

    2023-09-10 02:54:21
  • 简单实现Android本地音乐播放器

    2021-09-04 19:28:28
  • 使用Sharding-JDBC对数据进行分片处理详解

    2021-07-27 23:46:04
  • 深入理解Java设计模式之建造者模式

    2022-12-06 00:57:37
  • Maven生命周期和及插件原理用法详解

    2021-09-17 09:47:19
  • JavaEE7+Websockets+GlassFish4打造聊天室

    2023-11-29 01:01:39
  • Java实现统计字符串出现的次数

    2022-12-19 01:06:52
  • Java ThreadLocal类使用详解

    2022-08-04 05:29:34
  • java jdbc连接和使用详细介绍

    2023-01-13 18:12:52
  • 详解Spring注入集合(数组、List、Map、Set)类型属性

    2023-11-28 00:16:53
  • java实现短信通信的完整教程

    2023-03-23 23:03:40
  • Java TreeSet实现学生按年龄大小和姓名排序的方法示例

    2023-01-09 15:25:18
  • Java将Date日期类型字段转换成json字符串的方法

    2023-02-18 19:57:09
  • SpringBoot万字爆肝高级配置

    2022-09-17 06:34:08
  • 从java中调用matlab详细介绍

    2023-08-01 14:04:17
  • C#截图程序类似腾讯QQ截图实现代码

    2023-05-07 04:01:01
  • asp之家 软件编程 m.aspxhome.com