1. 简介

从net 4.0开始,C#开始支持延迟初始化,通过Lazy关键字,我们可以声明某个对象为仅仅当第一次使用的时候,再初始化,如果一直没有调用,那就不初始化,省去了一部分不必要的开销,提升了效率,同时Lazy是天生线程安全的

2. 应用场景

对象创建成本高且程序可能不会使用它。

例如,假定内存中有具有 Orders 属性的 Customer 对象,该对象包含大量 Order 对象,初始化这些对象需要数据库连接。 如果用户永远不要求显示 Orders 或在计算中使用该数据,则无需使用系统内存或计算周期来创建它。 通过使用 Lazy 来声明 Orders 对象用于迟缓初始化,可以避免在不使用该对象时浪费系统资源。

对象创建成本高,且希望将其创建推迟到其他高成本操作完成后。

例如,假定程序在启动时加载多个对象实例,但是只需立即加载其中一部分。 可以通过推迟初始化不需要的对象,直到创建所需对象,提升程序的启动性能。

3. Lazy基本用法

3.1. 方式一:构造时使用默认的初始化方式

在使用Lazy时,如果没有在构造函数中传入委托,则在首次访问值属性时,将会使用Activator.CreateInstance来创建类型的对象,如果此类型没有无参数的构造函数时将会引发运行时异常。

 1 using System; 2 3 namespace LazyUsage 4 {5     class LazyDemo 6     {7         static void Main() 8         {9             Lazy<Data> lazyData = new Lazy<Data>();
10             Console.WriteLine("Main->is lazyData Initialized? value = " + lazyData.IsValueCreated);
11             lazyData.Value.Print();//此处访问时才会将Data真正的初始化
12             Console.WriteLine("Main->is lazyData Initialized? value = " + lazyData.IsValueCreated);
13
14 Console.ReadKey();
15 }
16 }
17
18     class Data
19 {
20         public Data()
21 {
22             Console.WriteLine("Data::.ctor->Initialized");
23 }
24
25         public void Print()
26 {
27             Console.WriteLine("Data::Print->println");
28 }
29 }
30 }

执行结果:

Main->is lazyData Initialized? value = False
Data::.ctor->Initialized
Data::Print->println
Main->is lazyData Initialized? value = True

3.2. 方式二:构造时使用指定的委托初始化

using System;namespace LazyUsage
{class LazyDemo{static void Main(){//指定委托来初始化DataLazy<Data> lazyData = new Lazy<Data>(() \=>{Console.WriteLine("Main->lazyData will be Initialized!");return new Data("Test");});Console.WriteLine("Main->is lazyData Initialized? value = " + lazyData.IsValueCreated);lazyData.Value.Print();Console.WriteLine("Main->is lazyData Initialized? value = " + lazyData.IsValueCreated);Console.ReadKey();}}class Data{public string Name { get; private set; }public Data(string name){Name \= name;Console.WriteLine("Data::.ctor->Initialized,name = "+name);}public void Print(){Console.WriteLine("Data::Print->name = " + Name);}}
}

执行结果:

Main->is lazyData Initialized? value = False
Main->lazyData will be Initialized!
Data::.ctor->Initialized,name = Test
Data::Print->name = Test
Main->is lazyData Initialized? value = True

4. Lazy.Value的使用

Lazy对象创建后,并不会立即创建对应的对象,只有在变量的Value属性被首次访问时才会真正的创建,同时会将其缓存到Value中,以便将来访问。

Value属性是只读的,也就意味着如果Value存储了引用类型,将无法为其分配新对象,只可以更改此对象公共的属性或者字段等,如果Value存储的是值类型,那么就不能修改其值了,只能通过再次调用变量的函数使用新的参数来创建新的变量

在Lazy对象创建后,在首次访问变量的Value属性前,

5. 扩展

5.1 实现延迟属性

class Customer
{private Lazy<Orders> \_orders;public string CustomerID {get; private set;}public Customer(string id){CustomerID \= id;\_orders \= new Lazy<Orders>(() =>{return new Orders(this.CustomerID);});}public Orders MyOrders{get{return \_orders.Value;}}
}

在Lazy.Value的使用中可以得知:Value的属性是只读的,所以示例中只提供了Get的访问器,并未提供Set的访问器。

如果需要支持读取与写入属性的话,则Set访问器必须创建一个新的Lazy对象,同时必须编写自己的线程安全代码才能执行此操作

鸣谢:

https://blog.csdn.net/mingtianqingtian/article/details/112174792

https://docs.microsoft.com/zh-cn/dotnet/framework/performance/lazy-initialization

本文转自 https://www.cnblogs.com/yakniu/p/16342507.html

C#编程,Lazy(延迟初始化)用法相关推荐

  1. C#技巧 Lazy(延迟初始化)用法

    1. 简介 从net 4.0开始,C#开始支持延迟初始化,通过Lazy关键字,我们可以声明某个对象为仅仅当第一次使用的时候,再初始化,如果一直没有调用,那就不初始化,省去了一部分不必要的开销,提升了效 ...

  2. 【CSharp】延迟初始化(Lazy)

    参考 https://www.jb51.net/article/202143.htm 1. 什么是延迟初始化 延迟初始化是一种将对象的创建延迟到第一次需要用时的技术,换句话说,对象的初始化是发生在真正 ...

  3. Kotlin实战指南九:延迟初始化

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/93764289 本文出自[赵彦军的博客] 高阶函数 lateinit 延迟初始化 ...

  4. Python 延迟初始化(lazy property)

    Python 对象的延迟初始化是指,当它第一次被创建时才进行初始化,或者保存第一次创建的结果,然后每次调用的时候直接返回该结果. 延迟初始化主要用于提高性能,避免浪费计算,并减少程序的内存需求. pr ...

  5. Scala中的延迟初始化(Lazy vals)

    延迟初始化(Lazy vals) 除了前面介绍的预先初始化成员值外,你还是让系统自行决定何时初始化成员的初始值,这是通过在 val 定义前面添加 lazy(懒惰),也是说直到你第一次需要引用该成员是, ...

  6. java 延迟初始化_Java并发编程——延迟初始化占位类模式

    --仅作笔记使用,内容多摘自<java并发编程实战> 在并发编程中,如果状态变量仅在单个线程中初始化和使用,自然是线程安全的,但一旦涉及到线程间的数据交互,如何声明一个用于多线程的单例状态 ...

  7. 合理利用延迟初始化优化 Spring Boot

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1. 前言 随着我们项目 ...

  8. python基础教程:懒惰属性(延迟初始化)

    Python 对象的延迟初始化是指,当它第一次被创建时才进行初始化,或者保存第一次创建的结果,然后每次调用的时候直接返回该结果.延迟初始化主要用于提高性能,避免浪费计算,并减少程序的内存需求. 1. ...

  9. C#性能优化:延迟初始化LazyT

    1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...

最新文章

  1. 元宇宙:Facebook正式改名为Meta,要砸600亿做这件事
  2. Webkit for android
  3. date oracle 显示毫秒_Oracle中根据Date型转换成Java对应的long型毫秒数
  4. c语言else匹配问题
  5. 图片预加载插件 preLoad.js
  6. NetSet:一款功能强大的自动化网络流量安全增强工具
  7. python开发软件的实例-如何编写Python软件开发文档(7个技巧)
  8. Python中使用random随机函数与Matplotlib库绘制随机漫步图
  9. 4.MySQL优化---多表查询优化
  10. Opencv+Moviepy实现涂鸦视频和视频音轨分离合并操作。
  11. C语言--16进制转字符串
  12. SQLServer 启动问题,服务器错误代码126 解决办法
  13. 实验一:Guass列选主元消去法之C语言代码
  14. LittleVGL入门
  15. html_09网页超链接
  16. 用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)
  17. HDLBITS笔记五加法器减法器
  18. 《设计模式》设计模式的基本原则
  19. esp8266的TCP通信基础教程(结合手机APP)
  20. 【pandas】将单元格中的多个数据拆分为多行数据(explode),以csv文件为源文件进行处理

热门文章

  1. 班级管理系统c语言学号姓名,c++学生成绩管理系统1、问题描述 学生信息包括:学号、姓名、性别、年龄、班级等信息。 小学生...
  2. 教你轻松调DCT和ICC之间Timing与Congestion的一致性
  3. 成语接龙php源码,weiphp——成语接龙插件的对接和使用
  4. 跟这台计算机连接的一个USB设备运行不正常
  5. 解决 wmware windows虚拟机无法使用U盘,提示“跟这台电脑连接的一个usb设备运行不正常 windows无法识别它”的问题!
  6. 神犇营-my1002-朋友圈集赞
  7. ATS667LSG:真零速、高精度齿传感器 IC
  8. VUE微信H5生成二维码海报保存在本地相册
  9. 2020 几款常用 Redis 可视化工具
  10. WeQuant交易策略—5日均线