LazyT——C#基础知识回顾
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#基础知识回顾相关推荐
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- php基础知识总结大全,php基础知识回顾 —— 常量
您现在的位置是:网站首页>>PHP>>php php基础知识回顾 -- 常量 发布时间:2019-01-23 17:23:08作者:wangjian浏览量:489点赞量:0 在 ...
- java知识点博客园_JAVA基础知识回顾
JAVA基础知识回顾 一.背景介绍 JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platfo ...
- C语言基础知识回顾 2-三种基本机构
C语言基础知识回顾 %超适用于计算机二级% 第二章 三种基本结构 本章回顾最基本的顺序.条件.循环语句的语法结构,对于非初学者来说,这一部分内容想必早就信手拈来. 因此,回顾的侧重点都是一些需要注意的 ...
- 【Java基础知识回顾篇】之打怪升级Day001
Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...
- Java基础知识回顾之一 ----- 基本数据类型
前言 在开始工作至今,学习各种各样的技术之中发现自己的很多Java的基础知识都忘了⊙﹏⊙b汗... 而且越是学习越是发现Java基础的重要性,所以准备单独抽一下时间进行Java基础的重新学习.在重新学 ...
- 前端开发入门:html和css基础知识回顾2
HTML+CSS基础知识 1.对WEB标准以及W3C的理解与认识 标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外 链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被 ...
- JavaSE基础知识回顾
文章目录 JavaSE 一.前言 1.1.解决大家的疑惑 1.2.Java和Python的抉择 1.3.走进Java 二.预科 2.1.学习准备:博客 2.2.MarkDown 2.3.基本Dos命令 ...
- Java基础知识回顾之六 ----- IO流
前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...
- Java基础知识回顾之四 ----- 集合List、Map和Set
前言 在上一篇中回顾了Java的三大特性:封装.继承和多态.本篇则来介绍下集合. 集合介绍 我们在进行Java程序开发的时候,除了最常用的基础数据类型和String对象外,也经常会用到集合相关类. 集 ...
最新文章
- Codeforces Round #563 (Div. 2)/CF1174
- ArcGIS网络分析之构建网络分析数据集(一)
- C++ 预备知识
- hadoop集群中的日志文件
- fastjson与spring mvc整合的配置
- Java LocalDate类| 带示例的format()方法
- POJ 1681 高斯消元 枚举自由变元
- 【免费下载】2021年5月热门报告盘点下载
- python爬虫JS逆向加密破解之百度翻译
- 关于大学生创新创业项目赛事汇总
- viso添加多个图注_Visio画图几个技巧
- 键盘快捷键 —— 有用
- 给2011年的MacBook Pro和MacBook Air升级到最新系统和做双系统时遇到的问题
- Gos: Armed Golang
- EXTRACT() 提取函数
- git 公钥配置时问题解决记录
- 医学图像处理与深度学习入门
- 一位中科院自动化研究所博士毕业论文的致谢
- 客户端与平台存在有状态连接的系统蓝绿发布方案设计
- 非正弦周期信号的傅里叶级数展开式
热门文章
- 用c语言实现BF算法
- 计算机上机日志如何查找,如何查看金蝶KIS记账王上机日志
- AQS之ReenReadWriteLock
- 剪刀石头布java流程图_青岛能源所基于“剪刀石头布”策略实现快速多轮基因编辑...
- 启用特殊池解读 0x000000c5 蓝屏
- 17家IT初创公司失败史
- PyCharm使用技巧:windows下快捷键Ctrl+Alt+左箭头(后退)和Ctrl+Alt+右箭头(前进)冲突问题
- iPhone/iPad怎么进入恢复模式?苹果各机型启动恢复模式方法汇总
- JQuery fadeOut()函数与remove()函数合用时不生效的解决办法
- C语言int类型转换为char类型