[你必须知道的.NET]第三十三回,深入.NET 4.0之,LazyT点滴

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

我们往往有这样的情景,一个关联对象的创建需要较大的开销,为了避免在每次运行时创建这种家伙,有一种聪明的办法叫做实现“懒对象”,或者延迟加载。.NET 4.0之前,实现懒对象的机制,需要开发者自己来实现与管理,例如,你可以翻开老赵同志的较为理想的延迟代理的编写方式一文来了解其原理和场合。可喜的是,在.NET 4.0中包含的另一个好玩的家伙System.Lazy<T>。它的定义如下:

[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();
}
注:VS2010 Beta2对Lazy<T>和VS2010 Beta1有较大差异,因此本文仅以最新版本为标准,并不保证最终.NET 4.0正式版的实际情况。

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

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

那么,可以使用如下的方式来实现Big的延迟创建:

static void Main(string[] args)
{Lazy<Big> lazyBig = new Lazy<Big>();
}

从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提供的关注度实在不少,我们眼花缭乱了。

 

参考文献

  • Lazy Initialization, http://msdn.microsoft.com/en-us/library/dd997286(VS.100).aspx  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

频数直方图的步骤_绘制频数直方图步骤

怎样用excel制作频率分布直方图给出简单的步骤~有截图的话更好。我不知道按哪个东西~而且还要弄什么频(转载于word帮助文件&#xff0c;建议大家使用word时遇到问题按F1搜索帮助)使用直方图显示数据全部显示利用分析工具库的直方图工具&#xff0c;您可以分析数据并将其显示在直…

格式化css文件,css文件格式化脚本的方法

这次给大家带来css文件格式化脚本的方法&#xff0c;css文件格式化脚本的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。#!/usr/bin/python# -*- coding: UTF-8 -*-import sys,osdef format(ddt):ddt ddt.replace(\n,)#去除换行ddtddt.replace(;},}).…

[你必须知道的.NET]第三十四回,object成员,不见了!

在.NET世界了&#xff0c;object是公认的造物主&#xff0c;其麾下的7大成员&#xff0c;个顶个的横行在任何系统的任何代码角落。 public class Object {public Object();public virtual bool Equals(object obj);public static bool Equals(object objA, object objB);publi…

直接请求接口_http类型的post和get接口测试

我们做接口测试时候&#xff0c;会发现通常需要测试的接口类型有好几种&#xff0c;比较多的是http类型的接口&#xff0c;其他还有webservice接口&#xff0c;rpc接口等等&#xff0c;本次主要说下http类型的接口我们该怎么测试&#xff0c;还有该测试哪些东西。HTTP接口概念:…

css3加载中动画效果,CSS3实现加载中的动画效果

Loading 的菊花图形组合的不太好&#xff0c;基本上实现这个功能了动画解析这个动画用到的 CSS3 特性:transform 主要使用 transform 属性的 rotate&#xff0c;将线条组合成 Loading 图形 (也就是常见的菊花图形)animation 实现将线条颜色由浅到深&#xff0c;再由深到浅来回变…

[你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题

问题的提出 晚上翻着群里的聊天&#xff0c;发现一个有趣的问题&#xff1a;如何通过编码方式来判断一个dll或者exe为debug build还是release build&#xff1f;由于没有太多的讨论&#xff0c;所以我只好自己找点儿办法&#xff0c;试图解决这个问题&#xff0c;为夜生活带点…

执行本地sql_实用!5个在线 SQL 数据库环境

文章目录SQL FiddleDB Fiddledb<>fiddleSQL OnlineOracle Live SQL总结大今天给大家分享几个在线的免费 SQL 运行环境&#xff0c;也就是在线数据库。这些网站可以帮助我们快速运行一些 SQL 语句的测试或者验证&#xff0c;同时还可以在网络上进行分享&#xff0c;关键不…

网页传世服务器端,传世服务端文件分析

DB (数据库)baobao.db 宝宝(佩带套装引发&#xff0c;需设置套装属性)EvilMon.db 心魔Magic.db 技能Monster 怪物StdItems 装备&#xff0c;道具&#xff0c;物品说明&#xff1a;装备攻击、魔法、道术、等等Dbserver (数据服务器)Backup空ClearLog空Connection空FDBBackup数据…

ocp证书怎么考_没有基础怎么考初级会计证书?

初级会计证书这些年来越发火热&#xff0c;报考门槛也较低。多数报考初级会计证的考生都是没有基础的&#xff0c;那么怎么复习呢?今天会计网将给大家带来没有基础怎么考初级会计证书?1、制定一份适合自己的学习计划&#xff0c;分阶段学习对于没有基础的考生而言&#xff0c…

oracle sparc 服务器系统,OracleSPARC服务器基础.PDF

OracleSPARC服务器基础Oracle SPARC服务器基础及管理Agenda1. 服务器运行环境标准2. Oracle Sparc T5140维护与ILOM管理3. Oracle Solaris 基础4. 收集日志、故障分析、解决和案例分享2SPARC T5140环境输入电压 100 - 240 VAC, 50-60Hz8.3 - 7.2 A 100-120 VAC (max)输入电流4…

C#设计模式(23种设计模式)

创建型&#xff1a; 1. 单件模式(Singleton Pattern) 2. 抽象工厂&#xff08;Abstract Factory&#xff09; 3. 建造者模式(Builder) 4. 工厂方法模式&#xff08;Factory Method) 5. 原型模式(Prototype) 结构型&#xff1a; …

与gps优缺点_长缨在手,敢缚苍龙,中国北斗三号圆满收官,相比美国GPS怎样?...

2020年6月23日&#xff0c;北斗三号最后一颗全球组网卫星发射成功&#xff0c;完美收官。我们都知道信息化时代定位导航的重要性&#xff0c;那么中国北斗和美国GPS相对比怎么样呢&#xff1f;首先来了解一下北斗。中国的北斗导航系统是分三步建设的。卫星导航系统第一步在1994…

类似ajax封装函数,JS 封装一个async式的AJAX函数

其实也没什么&#xff0c;就是用上ES7的异步函数&#xff0c;让ajax使用起来更方便。这个方便主要是体现在&#xff1a;无回调 & 无then链式 & 轻松收集异常。大致分3步&#xff1a;1、封装API类(这步不用异步函数)这一步一般会单独建立一个文件&#xff01;// 定义一个…

11单件模式(Singleton Pattern)

创建型模式---单件模式(Singleton Pattern)动机&#xff08;Motivation): 在软件系统中&#xff0c;经常有这样一些特殊的类&#xff0c;必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器&#xff0c;…

查找字符位置_如何使用find函数和search函数精确查找字符

精确查找指定字符在一个字符串中的位置是Excel函数运用中的一项重要的技巧&#xff0c;尤其是在截取字符串、替换字符串等文本处理过程中&#xff0c;精确定位技术更是必不可少。查找字符的主要函数是find函数和search函数&#xff0c;两者的语法完全相同。find(find_text,with…

梦幻新开服务器维护,梦幻西游1月新区2017 1月新开服务器介绍

梦幻西游1月新区2016有什么呢&#xff0c;这个月的新开服务器已经出来了&#xff0c;很多朋友已经邀上自己的小伙伴们开战了&#xff0c;有的还没放假就等着下个月的新区了&#xff0c;下面我们就来看。梦幻西游1月新区2016&#xff1a;转眼步入2016年&#xff0c;在2016年1月份…

12抽象工厂(Abstract Factory)

常规的对象创建方法&#xff1a; //创建一个Road对象 Road road new Road(); new 的问题&#xff1a; 实现依赖&#xff0c;不能应对“具体实例化类型”的变化。解决思路&#xff1a; 封装变化点-----哪里变化&#xff0c;封装哪里 潜台词&#xff1a; 如果没有变…

typeahead有什么作用_typeahead使用配置参数。

示例代码&#xff1a;var suggestion_source new Bloodhound({datumTokenizer: Bloodhound.tokenizers.obj.whitespace("display_name"),queryTokenizer: Bloodhound.tokenizers.whitespace,remote: {url: "http://nominatim.openstreetmap.org/search?format…

dhcp服务器能为客户端提供哪些信息,为DHCP客户端提供DHCP服务器的MAC [关闭]

Background info:我有一套专有的嵌入式Linux网络设备&#xff0c;其中一个将配置为DHCP服务器&#xff0c;其余的将是DHCP客户端 .我需要让客户端设备只接受来自服务器设备的DHCP租约&#xff0c;忽略同一LAN上其他DHCP服务器提供的任何其他租约 . 同样&#xff0c;我需要使服务…

13建造者模式(Builder)

Builder模式的缘起&#xff1a; 假设创建游戏中的一个房屋House设施&#xff0c;该房屋的构建由几部分组成&#xff0c;且各个部分富于变化。如果使用最直观的设计方法&#xff0c;每一个房屋部分的变化&#xff0c;都将导致房屋构建的重新修正.....动机&#xff08;Motiva…