.NET
Framework 4
 在一次次跳票中终于发布了,在一次偶然的机会,我看到了 Anytao 的 [你必须知道的.NET]第三十三回,深入.NET
4.0之,Lazy<T>点滴
 。

我没有看过在.NET Framework 4.0 beta2 的 关于 Lazy<T> 的实现,也不知道正式版与之前的版本是否有过改进(改变),我只在这里来单纯地谈在.NET Framework 4 中 Lazy<T> 的实现。

1. Lazy<T> 概述

我们也许会遇到这样一种情况,我们有一个大家伙(大对象)需要创建,那么这个对象的创建时需要较长的时间,同时也需要在托管堆上分配较多的空间。

那么在.NET Framework 4 中提供了这样一个很聪明的方式:Lazy<T>(我们可以称之为懒对象)。当然,在之前,很多人也曾对其进行过自己的实现。

那么我们在这里就可以把 Lazy<T> 的作用总结为一句话,按需延迟加载。

2. Lazy<T> 的使用

了解了Lazy<T>的作用,让我们就来看下Lazy<T>如何应用。

class Program
{
static void Main(string[] args)
{
Lazy<Large> lazyObject = new Lazy<Large>();
Console.WriteLine(lazyObject.IsValueCreated);
lazyObject.Value.Test();
Console.WriteLine(lazyObject.IsValueCreated);
}
}

[Serializable]
class Large
{
public Large() { }
public void Test()
{
Console.WriteLine("Test");
}
}

运行结果如下:

这个例子很简单,也是Lazy<T>最基本,也是最常用的应用方式。

3. 实现自己的Lazy<T>

在.NET Framework 4.0之前,大对象就是存在的,那么对于一个大型系统而言,怎么样对付一个大对象呢。在我看来有两点:延迟加载和即时清理。前者解决创建问题,后者解决回收问题。

那么在来看Lazy<T>的.NET Framework实现之前,我们先来自己实现一个简单的Lazy<T>吧。

class MyLazy<T> where T : new()
{
private T value;
private bool isLoaded;
public MyLazy()
{
isLoaded = false;
}
public T Value
{
get
{
if (!isLoaded)
{
value = new T();
isLoaded = true;
}
return value;
}
}
}

这应该是最简单版本的Lazy<T>了,没有线程安全检测,其实什么都没有,只有着访问时创建真实对象,可是对于我们一般的应用来说也许就已经足够了。

4. Lazy<T>的.NET Framework实现

原本还想解释下代码的,可是太多了,解释不动了…….就写些主要把。

其实.NET Framework和上面的实现大同小异,有两点主要的不同:

A. 引入了Boxed内部类:

[Serializable]
private class Boxed
{
// Fields
internal T m_value;

// Methods
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
internal Boxed(T value)
{
this.m_value = value;
}
}

该内部类取代了我在上面实现中的泛型约束,使之更通用。

但是我们也应该注意到,如果T为结构体,那么由于T很大,所以装箱拆箱反而也许是个更耗费效率的事情,因此,个人建议,对值类型慎用Lazy<T>。

B. 线程安全的控制

在线程安全的控制选项中,.NET Framework为我们提供了这样的枚举选项:

public enum LazyThreadSafetyMode
{
None,
PublicationOnly,
ExecutionAndPublication
}

不做多余解释,关于这三者的具体意思,MSDN中已经说的很清楚了,可参加 这里 。

里面的代码比较麻烦,就不多说了。

5. 完善的大对象解决方案

在 Anytao 文章的回复中,我就提到了一点是:

个人倒觉得Lazy+WeakReference才是实现一个大对象的完整解决之道,一个按需加载,一个不定清理..... 

加到一起才完美。

但是 老赵 说:

又不是所有的大对象都需要自动清理……

那么我就不再重复去总结了,这两句话加到一起,我想应该可以得出一个比较完善的大对象处理方案吧。

如果这样,我们是否能对应地去创建一个单独的实现类:WeakLazy<T>呢。

这样相当于我们有了WeakReference,有了Lazy<T>,还有了WeakLazy<T>,那么我们是不是就可以很完整地根据情况选择应用了呢!

6. 总结

原本想写一些稍微深入点的东西,可是写到最后,发现仍为皮毛而,叹乎…….

深入Lazy<T>——.NET Framework 4.0的更多相关文章

  1. [EF2]Sneak Preview: Persistence Ignorance and POCO in Entity Framework 4.0

    http://blogs.msdn.com/b/adonet/archive/2009/05/11/sneak-preview-persistence-ignorance-and-poco-in-en ...

  2. 开发 ASP.NET vNext 续篇:云优化的概念、Entity Framework 7.0、简单吞吐量压力测试

    继续上一篇<开发 ASP.NET vNext 初步总结(使用Visual Studio 2014 CTP1)>之后, 关于云优化和版本控制: 我本想做一下MAC和LINUX的self-ho ...

  3. Windows7安装 .net framework 4.0

    1.首先下载安装包.net framework 4.0点击下载即可 2.安装,双击下载好的安装包

  4. ".NET Compact Framework v2.0 could not be found."

    参考: http://blog.csdn.net/godcyx/article/details/7348431 问题原因: That's a known issue where VS can't di ...

  5. [已解决]:调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "c:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.

    现象:我的是 win7, iis7, 64bit, 打开网站错误如下: 错误摘要 HTTP 错误 500.0 - Internal Server Error 调用 LoadLibraryEx 失败,在 ...

  6. You may receive an exception when you browse a .NET Framework 2.0 ASP.NET Web application

    SYMPTOMS When you browse a Microsoft .NET Framework 2.0 ASP.NET Web application, you may receive one ...

  7. spring 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x)

    spring官方网站改版后,建议都是通过 Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常麻烦,下给出Spring Framework jar官方直接下载路径: h ...

  8. 转发 win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案

    win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NE ...

  9. Entity Framework 5.0系列之Code First数据库迁移

    我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...

随机推荐

  1. Stable Matching (Gale Sharpley Algorithm)

    稳定婚配问题:n个男生n个女生.当中每一个人都有自己心仪的列表. 问怎样达成稳定的匹配(比方, b想B求婚,可是B已有的对象的优先级高于b,此时b的魅力不足以拆散B所处的那一对,即达到稳定状态.) ( ...

  2. AlertDialog的onCreateDialog与onPrepareDialog用法

    场景:在一个Activity中多次使用弹出对话框.而且对话框携带着动态变化的信息数据,这时假设仅仅使用onCreateDialog(int id, Bundle bundle)回调,则会发现第一次以后 ...

  3. 【57.97%】【codeforces Round #380A】Interview with Oleg

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. 前端项目课程3 jquery1.8.3到1.11.1有了哪些新改变

    web项目课程3  jquery1.8.3到1.11.1有了哪些新改变 一.总结 一句话总结:领会官方升级的意思.  1.live();    2.die();    3.bind();    4.u ...

  5. gvim 窗口最大化启动

    此文来源于vimer的程序世界 首先需要 gvimfullscreen.dll 文件  下载gvimfullscreen.dll 下载源码 之后只需要在vimrc中配置如下代码就可以按F11使Vim全 ...

  6. CComboBox自动匹配

    void CLoadPhotoDlg::OnCbnEditchangeCombo1() {  // TODO: 在此添加控件通知处理程序代码  UpdateData(TRUE);  CComboBox ...

  7. Nginx+Tomcat搭建高性能负载均衡集群的实现方法

    一.    目标实现高性能负载均衡的Tomcat集群: 二.步骤 1.首先下载Nginx,要下载稳定版: 2.然后解压两个Tomcat,分别命名为apache-tomcat-6.0.33-1和apac ...

  8. [Javascript Natural] Break up language strings into parts using Natural

    A part of Natural Language Processing (NLP) is processing text by “tokenizing” language strings. Thi ...

  9. Pandoc —— 标记语言转换工具(中文乱码问题)

    今次毕业设计,来个逼格高的,用 latex 编写.谁曾想,学院首先要收一份 word 版的.辣么多的 latex 公式如何转呀. Pandoc 是由 John MacFarlane 开发的标记语言转换 ...

  10. ViewChild与ContentChild的联系和区别

    原文 https://www.jianshu.com/p/5ab619e576ea 大纲 1.认识ViewChild 2.认识ContentChild 3.ViewChild与ContentChild ...