Can you explain Lazy Loading?
Introduction
Lazy loading is a concept where we delay the loading of the object until the point where we need it. Putting in simple words, on demand object loading rather than loading objects unnecessarily.
For example, consider the below example where we have a simple Customer
class and this Customer
class has many Order
objects inside it. Have a close look at the constructor of the Customer
class. When the Customer
object is created it also loads the Order
object at that moment. So even if we need or do not need the Order
object, it’s still loaded.
But how about just loading the Customer
object initially and then on demand basis load the Order
object?
public class Customer
{
private List<Order> _Orders= null;
…
…
public Customer()
{
_CustomerName = "Shiv";
_Orders = LoadOrders(); // Loads the order object even though //not needed
} private List<Order> LoadOrders()
{
List<Order> temp = new List<Order>();
Order o = new Order();
o.OrderNumber = "ord1001";
temp.Add(o);
o = new Order();
o.OrderNumber = "ord1002";
temp.Add(o);
return temp;
}
}
So let’s consider you have client code which consumes the Customer
class as shown below. So when the Customer
object is created no Order
objects should be loaded at that moment. But as soon as the foreach
loop runs you would like to load the Order
object at that point (on demand object loading).
Customer o = new Customer(); // order object not loaded
Console.WriteLine(o.CustomerName);
foreach (Order o1 in o.Orders) // Load order object only at this moment
{
Console.WriteLine(o1.OrderNumber);
}
So how do we implement lazy loading?
For the above example if we want to implement lazy loading we will need to make the following changes:
- Remove the
Order
object loading from the constructor. - In the
Order
get property, load theOrder
object only if it’s not loaded.
public class Customer
{
private List<Order> _Orders= null;
…
…
public Customer()
{
_CustomerName = "Shiv";
}
public List<Order> Orders
{
get
{
if (_Orders == null)
{
_Orders = LoadOrders();
}
return _Orders;
}
}
Now if you run the client code and halt your debugger just before the foreach
loop runs over the Orders
object, you can see the Orders
object is null
(i.e., not loaded). But as soon as the foreach
loop runs over the Order
object it creates the Order
object collection.
Are there any readymade objects in .NET by which we can implement lazy loading?
In .NET we have the Lazy<T>
class which provides automatic support for lazy loading. So let’s say if you want to implement Lazy<>
in the above code, we need to implement two steps:
Create the object of orders using the Lazy
generic class.
private Lazy<List<Order>> _Orders= null;
Attach this Lazy<>
object with the method which will help us load the order’s data.
_Orders = new Lazy<List<Order>>(() => LoadOrders());
Now as soon as any client makes a call to the _Orders
object, it will call the LoadOrders
function to load the data.
You will get the List<orders>
data in the Value
property.
public List<Order> Orders
{
get
{
return _Orders.Value;
} }
Below goes the full code for this:
public class Customer
{
private Lazy<List<Order>> _Orders= null;
public List<Order> Orders
{
get
{
return _Orders.Value;
}
}
public Customer()
{
// Makes a database trip
_CustomerName = "Shiv";
_Orders = new Lazy<List<Order>>(() => LoadOrders());
}
}
What are the advantages and disadvantages of lazy loading?
Below are the advantages of lazy loading:
- Minimizes start up time of the application.
- Application consumes less memory because of on-demand loading.
- Unnecessary database SQL execution is avoided.
The only one disadvantage is that the code becomes complicated. As we need to do checks if the loading is needed or not, there is a slight decrease in performance.
But the advantages are far more than the disadvantages.
FYI: The opposite of Lazy Loading is eager loading. So in eager loading we load all the objects in memory as soon as the object is created.
Also have a look at below posted video on Lazy Loading: -
License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
原文链接:http://www.codeproject.com/Articles/652556/Can-you-explain-Lazy-Loading
本文地址:http://www.cnblogs.com/Interkey/articles/LazyLoading.html
.NET version 4.0 Framework or later and VS2010 or later is required for the Lazy class.
Lazy<T> Class: http://msdn.microsoft.com/en-us/library/dd642331(v=vs.100).aspx
建议阅读原文后面的 Comments and Discussions .
相关阅读:
http://www.cnblogs.com/Allen-Li/archive/2012/03/15/2398063.html
http://en.wikipedia.org/wiki/Lazy_loading
Can you explain Lazy Loading?的更多相关文章
- Angular2+typescript+webpack2(支持aot, tree shaking, lazy loading)
概述 Angular2官方推荐的应该是使用systemjs加载, 但是当我使用到它的tree shaking的时候,发现如果使用systemjs+rollup,只能打包成一个文件,然后lazy loa ...
- Lazyr.js – 延迟加载图片(Lazy Loading)
Lazyr.js 是一个小的.快速的.现代的.相互间无依赖的图片延迟加载库.通过延迟加载图片,让图片出现在(或接近))视窗才加载来提高页面打开速度.这个库通过保持最少选项并最大化速度. 在线演示 ...
- [AngularJS] Lazy Loading modules with ui-router and ocLazyLoad
We've looked at lazy loading with ocLazyLoad previously, but what if we are using ui-router and want ...
- [AngularJS] Lazy loading Angular modules with ocLazyLoad
With the ocLazyLoad you can load AngularJS modules on demand. This is very handy for runtime loading ...
- iOS swift lazy loading
Why bother lazy loading and purging pages, you ask? Well, in this example, it won't matter too much ...
- Entity Framework加载相关实体——延迟加载Lazy Loading、贪婪加载Eager Loading、显示加载Explicit Loading
Entity Framework提供了三种加载相关实体的方法:Lazy Loading,Eager Loading和Explicit Loading.首先我们先来看一下MSDN对三种加载实体方法的定义 ...
- Lazy Loading | Explicit Loading | Eager Loading in EntityFramework and EntityFramework.Core
EntityFramework Eagerly Loading Eager loading is the process whereby a query for one type of entity ...
- EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
前言 本篇是上一篇EFCore Lazy Loading + Inheritance = 干净的数据表 (一) [献给处女座的DB First程序猿] 前菜 的续篇.这一篇才是真的为处女座的DB Fi ...
- EFCore Lazy Loading + Inheritance = 干净的数据表 (一) 【献给处女座的DB First程序猿】
前言 α角 与 β角 关于α角 与 β角的介绍,请见上文 如何用EFCore Lazy Loading实现Entity Split. 本篇会继续有关于β角的彩蛋在等着大家去发掘./斜眼笑 其他 本篇的 ...
随机推荐
- 高吞吐量的分布式发布订阅消息系统Kafka-- 管理工具 Kafka Manager
一.概述 Kafka在雅虎内部被很多团队使用,媒体团队用它做实时分析流水线,可以处理高达20Gbps(压缩数据)的峰值带宽. 为了简化开发者和服务工程师维护Kafka集群的工作,构建了一个叫做Kafk ...
- SQL Server 2016 需要单独安装SSMS
默认安装完 MSSQL 后,不自带 SSMS 的管理工具了,需要的话可以单独安装,貌似更专业了一些. https://msdn.microsoft.com/library/mt238290.aspx ...
- 一台服务器部署多个tomcat
bin 目录下两文件 catalina.sh.startup.sh conf 目录下一个文件 server.xml
- 【AI】蒙特卡洛搜索树
http://jeffbradberry.com/posts/2015/09/intro-to-monte-carlo-tree-search/ 蒙特卡洛方法与随机优化: http://iacs-co ...
- cmd窗口编码方式的修改
cmd默认的编码是采用GBK regedit HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe\CodePage 十进制:936 GB ...
- 用gameMaker做个小游戏
看下面这个课程链接,半小时学会 http://study.163.com/course/courseMain.htm?courseId=352004#/courseMain 这是我做的:http:// ...
- CCF推荐国际学术会议
类别如下计算机系统与高性能计算,计算机网络,网络与信息安全,软件工程,系统软件与程序设计语言,数据库.数据挖掘与内容检索,计算机科学理论,计算机图形学与多媒体,人工智能与模式识别,人机交互与普适计算, ...
- CG
//设置线的宽度 CGContextSetLineWidth(ctx, 12); //设置线的连接处 (拐点) CGContextSetLineJoin(ctx, kCGLineJoinRound ) ...
- Windows Azure Compute Emulator无法启动问题解决方案
Visual Studio 2013安装了Windows Azure SDK 2.7,但启动Emulator调试时,出现如下错误: Error: The installed Windows Azure ...
- 4.3.3版本之引擎bug
bug描述: IOS设备上,当使用WWW www = WWW.LoadFromCacheOrDownload(url, verNum); 下载资源时,第一次下载某个资源,www.assetBundle ...