在微软发布的.NET Framework 4.0的Beta 2版本中,其又给我们带来了很多新东西,由于不知道正式版与之前的版本是否有过改进,我们只在这里来单纯地谈谈在.NET Framework 4.0中关于Lazy
创新互联公司专注于沧县企业网站建设,响应式网站开发,商城网站定制开发。沧县网站建设公司,为沧县等地区提供建站服务。全流程按需网站开发,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务
1.Lazy
我们也许会遇到这样一种情况,我们有一个大家伙(大对象)需要创建,那么这个对象的创建时需要较长的时间,同时也需要在托管堆上分配较多的空间。那么在.NET Framework 4.0中提供了这样一个很聪明的方式:Lazy
2.Lazy
了解了Lazy
- classProgram
- {
- staticvoidMain(string[]args)
- {
- Lazy
lazyObject=newLazy (); - Console.WriteLine(lazyObject.IsValueCreated);
- lazyObject.Value.Test();
- Console.WriteLine(lazyObject.IsValueCreated);
- }
- }
- [Serializable]
- classLarge
- {
- publicLarge(){}
- publicvoidTest()
- {
- Console.WriteLine("Test");
- }
- }
这个例子很简单,也是Lazy
3.实现自己的Lazy
在.NET Framework 4.0之前,大对象就是存在的,那么对于一个大型系统而言,怎么样对付一个大对象呢。在我看来有两点:延迟加载和即时清理。前者解决创建问题,后者解决回收问题,那么在来看Lazy
- classMyLazy
whereT:new() - {
- privateTvalue;
- privateboolisLoaded;
- publicMyLazy()
- {
- isLoaded=false;
- }
- publicTValue
- {
- get
- {
- if(!isLoaded)
- {
- value=newT();
- isLoaded=true;
- }
- returnvalue;
- }
- }
- }
这应该是最简单版本的Lazy
4.Lazy
原本还想解释下代码的,可是太多了,就写些主要吧,其实.NET Framework和上面的实现大同小异,有两点主要的不同:
A.引入了Boxed内部类:
- [Serializable]
- privateclassBoxed
- {
- //Fields
- internalTm_value;
- //Methods
- [TargetedPatchingOptOut("PerformancecriticaltoinlinethistypeofmethodacrossNGenimageboundaries")]
- internalBoxed(Tvalue)
- {
- this.m_value=value;
- }
- }
该内部类取代了我在上面实现中的泛型约束,使之更通用,但是我们也应该注意到,如果T为结构体,那么由于T很大,所以装箱拆箱反而也许是个更耗费效率的事情,因此,个人建议,对值类型慎用Lazy
B.线程安全的控制
在线程安全的控制选项中,.NET Framework为我们提供了这样的枚举选项:
- publicenumLazyThreadSafetyMode
- {
- None,
- PublicationOnly,
- ExecutionAndPublication
- }
不做多余解释,关于这三者的具体意思,MSDN中已经说的很清楚了,可参加这里,里面的代码比较麻烦,就不多说了。
5.完善的大对象解决方案
在Anytao文章的回复中提到了一点是:Lazy+WeakReference才是实现一个大对象的完整解决之道,一个按需加载,一个不定清理,加到一起才完美。
本文转自飞林沙的博客,
原文地址:http://www.cnblogs.com/kym/archive/2010/02/21/1670226.html
【编辑推荐】
文章名称:深入.NET Framework 4.0 关于Lazy的点滴
网址分享:http://www.stwzsj.com/qtweb/news47/6247.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联