.NET Framework 4.0中的按需构造:Lazy
假设您正在编写一个应用程序,在某些情况下需要使用一个特定对象。此外,假设您需要的对象的创建和使用是非常昂贵的,你不想每次您的应用程序运行时都创建它,只在你需要它的时候才创建它。
当然你可以自己管理这一切,但 Lazy<T>将使这个任务变得容易。你只需要在那个”昂贵”的对象上创建一个 lazy包装器:
Lazy<ExpensiveResource> ownedResource = new Lazy<ExpensiveResource>();
然后你可以简单引用 ‘ownedResource.Value’来获取那个”昂贵”的对象。当你第一次访问ownedResource.Value时,这个”昂贵”的资源才会被分配,而不是以前就分配。
Lazy<T>同时还有一个boolean属性,叫IsValueCreated,你可以检查这个属性来查看值是否已经创建。
支持没有默认构造函数的类型
Lazy<T> 不会强制new()约束。你可以在支持不同构造函数,甚至工厂方法实例化的类型上使用Lazy<T>。第二个构造函数指定一个返回新”昂贵”资源的泛型方法:Func<T>:
Lazy ownedResource = new Lazy( () => new ExpensiveResource("filename.data"));
你可以使用这个第二个构造函数来更好的控制使用什么样的代码来创建这个”昂贵”的资源。我在这使用了一个不同的构造函数,但你可以使用工厂方法、IOC容器、或其它方法。
我们生活在多核的世界
Lazy<T>另有两个其它构造函数:
public Lazy(bool isThreadSafe);
public Lazy(Func<T> valueFactory, bool isThreadSafe);
这两个构造函数指示出程序运行在多核的环境中。”昂贵”对象延迟(lazy)创建必须进行同步。(毕竟是”昂贵”对象,你不会需要两个这种对象)。
这是一个简单的类型,但正是这些类型你将一次又一次使用他们。
首发张文杰的博客:http://zhangwenjie.net (转载请保留,谢谢)。本文地址: http://zhangwenjie.net/archives/263.html

