C#基础知识回顾---你不知道的Lazy<T>

对象的创建方式,始终代表了软件工业的生产力方向,代表了先进软件技术发展的方向,也代表了广大程序开发者的集体智慧。以new的方式创建,通过工厂方法,利用IoC容器,都以不同的方式实现了活生生实例成员的创生。而本文所关注的Lazy<T>也是干这事儿的。不过,简单说来,Lazy<T>要实现的就是按“需”创建,而不是按时创建。

我们往往有这样的情景,一个关联对象的创建需要较大的开销,为了避免在每次运行时创建这种家伙,有一种聪明的办法叫做实现“懒对象”,或者延迟加载。.NET 4.0之前,实现懒对象的机制,需要开发者自己来实现与管理它的定义如下:

[Serializable]
public class Lazy<T>
{public Lazy();public Lazy(bool isThreadSafe);public Lazy(Func<T> valueFactory);public Lazy(Func<T> valueFactory, bool isThreadSafe);public bool IsValueCreated { get; }public T Value { get; }public override string ToString();
}

假设,我们有一个大块头:

public class Big
{public int ID { get; set; }// Other resources
}

从Lazy<T>的定义可知,其Value属性就是我们包装在Lazy Wrapper中的真实Big对象,那么当我们第一次访问lazyBig.Value时,就回自动的创建Big实例。

static void Main(string[] args)
{Lazy<Big> lazyBig = new Lazy<Big>();Console.WriteLine(lazyBig.Value.ID);
}

当然,有其定义可知,Lazy远没有这么小儿科,它同时还可以为我们提供以下的服务:

  • 通过IsValueCreated,获取是否“已经”创建了实例对象。
  • 解决非默认构造函数问题。

显而易见。我们的Big类并没有提供带参数构造函数,那么如下的Big类:

public class Big
{public Big(int id){this.ID = id;}public int ID { get; set; }// Other resources
}

上述创建方式将引发运行时异常,提示包装对象没有无参的构造函数。那么,这种情形下的延迟加载,该如何应对呢?其实Lazy<T>的构造中还包括:

public Lazy(Func<T> valueFactory);

它正是用来应对这样的挑战:

static void Main(string[] args)
{// Lazy<Big> lazyBig = new Lazy<Big>();Lazy<Big> lazyBig = new Lazy<Big>(() => new Big(100));Console.WriteLine(lazyBig.Value.ID);
}

其实,从public Lazy(Func<T> valueFactory)的定义可知,valueFactory可以返回任意的T实例,那么任何复杂的构造函数,对象工厂或者IoC容器方式都可以在此以轻松的方式兼容,例如:

public class BigFactory
{public static Big Build(){return new Big(100);}
}

可以应用Lazy<T>和BigFactory实现Big的延迟加载:

static void Main(string[] args)
{Lazy<Big> lazyBig = new Lazy<Big>(() => BigFactory.Build());Console.WriteLine(lazyBig.Value.ID);
}
  • 提供多线程环境支持。

另外的构造器:

public Lazy(bool isThreadSafe);
public Lazy(Func<T> valueFactory, bool isThreadSafe);

中,isThreadSafe则应用于多线程环境下,如果isThreadSafe为false,那么延迟加载对象则一次只能创建于一个线程。

关于Lazy<T>的应用,其实已经不是一个纯粹的语言问题,还涉及了对设计的考量,例如实现整个对象的延迟加载,或者实现延迟属性,考量线程安全等等。就不说教太多。因为,.NET 4.0提供的关注度实在不少,我们眼花缭乱了。

LazyT——C#基础知识回顾相关推荐

  1. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  2. php基础知识总结大全,php基础知识回顾 —— 常量

    您现在的位置是:网站首页>>PHP>>php php基础知识回顾 -- 常量 发布时间:2019-01-23 17:23:08作者:wangjian浏览量:489点赞量:0 在 ...

  3. java知识点博客园_JAVA基础知识回顾

    JAVA基础知识回顾 一.背景介绍 JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platfo ...

  4. C语言基础知识回顾 2-三种基本机构

    C语言基础知识回顾 %超适用于计算机二级% 第二章 三种基本结构 本章回顾最基本的顺序.条件.循环语句的语法结构,对于非初学者来说,这一部分内容想必早就信手拈来. 因此,回顾的侧重点都是一些需要注意的 ...

  5. 【Java基础知识回顾篇】之打怪升级Day001

    Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...

  6. Java基础知识回顾之一 ----- 基本数据类型

    前言 在开始工作至今,学习各种各样的技术之中发现自己的很多Java的基础知识都忘了⊙﹏⊙b汗... 而且越是学习越是发现Java基础的重要性,所以准备单独抽一下时间进行Java基础的重新学习.在重新学 ...

  7. 前端开发入门:html和css基础知识回顾2

    HTML+CSS基础知识 1.对WEB标准以及W3C的理解与认识 标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外 链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被 ...

  8. JavaSE基础知识回顾

    文章目录 JavaSE 一.前言 1.1.解决大家的疑惑 1.2.Java和Python的抉择 1.3.走进Java 二.预科 2.1.学习准备:博客 2.2.MarkDown 2.3.基本Dos命令 ...

  9. Java基础知识回顾之六 ----- IO流

    前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...

  10. Java基础知识回顾之四 ----- 集合List、Map和Set

    前言 在上一篇中回顾了Java的三大特性:封装.继承和多态.本篇则来介绍下集合. 集合介绍 我们在进行Java程序开发的时候,除了最常用的基础数据类型和String对象外,也经常会用到集合相关类. 集 ...

最新文章

  1. Codeforces Round #563 (Div. 2)/CF1174
  2. ArcGIS网络分析之构建网络分析数据集(一)
  3. C++ 预备知识
  4. hadoop集群中的日志文件
  5. fastjson与spring mvc整合的配置
  6. Java LocalDate类| 带示例的format()方法
  7. POJ 1681 高斯消元 枚举自由变元
  8. 【免费下载】2021年5月热门报告盘点下载
  9. python爬虫JS逆向加密破解之百度翻译
  10. 关于大学生创新创业项目赛事汇总
  11. viso添加多个图注_Visio画图几个技巧
  12. 键盘快捷键 —— 有用
  13. 给2011年的MacBook Pro和MacBook Air升级到最新系统和做双系统时遇到的问题
  14. Gos: Armed Golang
  15. EXTRACT() 提取函数
  16. git 公钥配置时问题解决记录
  17. 医学图像处理与深度学习入门
  18. 一位中科院自动化研究所博士毕业论文的致谢
  19. 客户端与平台存在有状态连接的系统蓝绿发布方案设计
  20. 非正弦周期信号的傅里叶级数展开式

热门文章

  1. 用c语言实现BF算法
  2. 计算机上机日志如何查找,如何查看金蝶KIS记账王上机日志
  3. AQS之ReenReadWriteLock
  4. 剪刀石头布java流程图_青岛能源所基于“剪刀石头布”策略实现快速多轮基因编辑...
  5. 启用特殊池解读 0x000000c5 蓝屏
  6. 17家IT初创公司失败史
  7. PyCharm使用技巧:windows下快捷键Ctrl+Alt+左箭头(后退)和Ctrl+Alt+右箭头(前进)冲突问题
  8. iPhone/iPad怎么进入恢复模式?苹果各机型启动恢复模式方法汇总
  9. JQuery fadeOut()函数与remove()函数合用时不生效的解决办法
  10. C语言int类型转换为char类型