C#中的Lazy如何使用详解
前言
延迟初始化是一种将对象的创建延迟到第一次需要用时的技术,换句话说,对象的初始化是发生在真正需要的时候才执行,值得注意的是,术语 延迟初始化和 延迟实例化的意思是相同的——可以互换使用,通过使用 延迟初始化技术,可以避免应用程序不必要的计算和内存消耗,这篇文章我们将会讨论如何在C#中使用延迟初始化。
有些朋友听完这些可能会懵逼,接下来用一个简单的例子来了解下延迟加载的场景,考虑下面两个类, Customer和 Order,Customer类包含了一个Orders属性,一个人肯定会有很多的订单,也就意味着它可能包含了很多的数据,甚至还需要连接数据库去获取Orders记录,在这种场景下,没必要给customer集合中的所有人都带上完整的orders,这个初始化开销是巨大的,优化点就是不加载Orders,直到某些customer真的需要Orders时才按需灌入。
使用Lazy
你可以自己写一段逻辑来实现延迟初始化,在 .NetFramework4.0之后就没必要了,因为在 System命名空间下已经提供了 Lazy
当使用Lazy
Lazy>orders=newLazy >(); IEnumerable result=lazyOrders.Value;
现在,考虑下面的两个类:Author和 Blog,一个作者可以写很多文章,所以这两个类之间是 一对多的关系,下面的代码片段展示了这种关系。
publicclassAuthor { publicintId{get;set;} publicstringFirstName{get;set;} publicstringLastName{get;set;} publicstringAddress{get;set;} publicListBlogs{get;set;} } publicclassBlog { publicintId{get;set;} publicstringTitle{get;set;} publicDateTimePublicationDate{get;set;} }
值得注意的是,关系型数据库中的一对多关系映射到对象模型就是 Author类中增加一个ListBlogs属性,使用这个属性,Author就可以维持一个或者多个Blog实例对象,对吧。
现在假定在用户界面上仅需展示Author的基础信息,比如说:(firstname,lastname,address),在这种场景下,给Author对象加载Blogs集合是毫无意义的,当真的需要加载Blogs时,执行Blogs.Value即可立即执行,下面展示了 Lazy
publicclassAuthor { publicintId{get;set;} publicstringFirstName{get;set;} publicstringLastName{get;set;} publicstringAddress{get;set;} publicLazy>Blogs=>newLazy >(()=>GetBlogDetailsForAuthor(this.Id)); privateIList GetBlogDetailsForAuthor(intId) { //Writecodeheretoretrieveallblogdetailsforanauthor. } }
使用通用的Lazy
接下来让我们看看如何使用泛型的Lazy实现单例模式,下面的 StateManager是线程安全的,同时为了演示 延迟初始化,我使用了静态构造函数来确保C#编译器不会将它标记为 beforefieldinit。
publicsealedclassStateManager { privateStateManager() { } publicstaticStateManagerInstance { get { returnNested.obj; } } privateclassNested { staticNested() { } internalstaticreadonlyStateManagerobj=newStateManager(); } }
下面我用Lazy
publicclassStateManager { privatestaticreadonlyLazyobj=newLazy (()=>newStateManager()); privateStateManager(){} publicstaticStateManagerInstance { get { returnobj.Value; } } }
可以瞄一下上面代码的Instance属性,它被做成只读属性了,同时也要注意obj.Value也是一个只读属性。
publicclassLazy{ publicTValue { get { if(_state!=null) { returnCreateValue(); } return_value; } } }
延迟初始化是一个很不错的性能优化技术,它允许你将那些资源密集型的对象延迟到你真正需要加载的时候再加载,大家结合自己的场景尽情的使用吧!
总结
到此这篇关于C#中Lazy如何使用的文章就介绍到这了,更多相关C#中Lazy使用内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
译文链接:https://www.infoworld.com/article/3227207/how-to-perform-lazy-initialization-in-c.html