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

对象的创建方式,始终代表了软件工业的生产力方向,代表了先进软件技术发展的方向,也代表了广大程序开发者的集体智慧。以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
}

时间: 2025-01-21 00:01:55

[你必须知道的.NET]第三十三回,深入.NET 4.0之,Lazy&lt;T&gt;点滴的相关文章

[你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望

总体来说,这是一篇介绍性的文章,不会涉及过多技术细节和研究过程.但是,作为拉开序幕的第一页,本文以提纲挈领的方式展开对.NET 4.0的初次体验.从What's new的角度,开始我对.NET 4.0新特性的探索之旅.既然是介绍,那么首先给出导航式的链接是必要而必须的,因为一篇小小的篇幅却是难以交代全面What's new in details,所以看官尽情各取所需吧: Visual Studio 2010 in MSDN What's New in Visual Studio 2010 Wha

[你必须知道的.NET]第三十回:.NET十年(下)

引言 语言是程序开发者行走江湖的手上利器,各大门派的高手在论坛.博客为了自家门派争吵不已早是技术世界中的亮丽风景,虽多少为刚刚踏入江湖的新手提供了思考的素材,但也同时迷惑了初出茅庐的前行方向. 本文不欲计较门派的高下,旨在明辨技术的真谛,这就是.NET平台下的开发利器:C#语言,并从其变迁的进程中对于.NET技术发展把玩一番. 在下篇,我们将从历史走来,对.NET的未来做个展望性的了解,具体而言就是.NET 4.0的新东西. .NET之,未来武器 无论如何,.NET 4.0已经在叩开新年的大门之

[你必须知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二

本系列文章导航 [你必须知道的.NET] 开篇有益 [你必须知道的.NET] 第一回:恩怨情仇:is和as [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类 [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.NET] 第四回:后来居上:class和struct [你必须知道的.NET] 第五回:深入浅出关键字---把new说透 [你必须知道的.NET] 第六回:深入浅出关键字---base和this [你必须知道的.NET] 第七回:品味类型---从通用类型系统开

艾伟:[你必须知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二

本系列文章导航 [你必须知道的.NET] 开篇有益 [你必须知道的.NET] 第一回:恩怨情仇:is和as [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类 [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.NET] 第四回:后来居上:class和struct [你必须知道的.NET] 第五回:深入浅出关键字---把new说透 [你必须知道的.NET] 第六回:深入浅出关键字---base和this [你必须知道的.NET] 第七回:品味类型---从通用类型系统开

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

问题的提出 晚上翻着群里的聊天,发现一个有趣的问题:如何通过编码方式来判断一个dll或者exe为debug build还是release build?由于没有太多的讨论,所以我只好自己找点儿办法,试图解决这个问题,为夜生活带点刺激.于是,便有了本文的探索和分析. 当然,为了充分的调动起大家的主意,省去不必要的google操作,我觉得有必要对Debug和Release两种模式的异同进行一点提纲挈领式的分析,从而为接下来的解决方案打好基础. Debug & Release 我们应用Visual St

[你必须知道的.NET]第二十四回:认识元数据和IL(上)

说在,开篇之前 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注,本文就是开始. 1 引言 你可曾想到,我们的C#代码,编译之后究竟为何物?你可曾认知,我们的可执行程序,运行之时的轨迹究竟为哪般?那么,本文通过对Metadata(元数据)和IL(Intermediate Language, 中间语

[你必须知道的.NET]第十四回:认识IL代码---从开始到现在

本文将介绍以下内容: ·IL代码分析方法 ·IL命令解析 ·.NET学习方法论 1.引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持,给予了anytao巨大的鼓励和动力.俱往昔,我发现很多的园友都把目光和焦点注意在如何理解IL代码这个问题上.对我来说,这真是个莫大的好消息,因为很明显我们的思路慢慢的从应用向底层发生着转变,技巧性的东西是一个方面的积累,底层的探索在我认为也是必不可少的修炼.如果我们选择了来关注这项修炼,那么我们就应该选择如何来着手这项修炼,首先关注anyta

[你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二

Tuple,是函数式编程的概念之一,早见于Elang.F#等动态语言.不过,我第一次听说Tuple还早在2005年园子的Ninputer大牛提出在.NET 2.0实现Tuple的基本想法,我们可以通过以下地址仰慕当时的历史片段: 探讨.NET 2.0中Tuple的实现方法 由此可见,Tuple不是.NET 4.0的创造发明,但却是C#趋于函数式编程概念的必要补充.那么,我们首先来看看,什么是Tuple? Tuple为何物? 什么是Tuple,在汉语上我们将其翻译为元组.Tuple的概念源于数学概

[你必须知道的.NET] 第三回:历史纠葛:特性和属性

1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定,[Serializable].[Flags].[DllImport].[AttributeUsage]这些的构造,相信我们都见过吧,那么你是否了解其背后的技术. 提起特性,由于高级语言发展的历史原因,不免让人想起另一个耳熟能详的名字:属性.特性和属性,往往给初学者或者从C++转移到C#的人混淆的概