在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载。有些情况如果不延迟加载,可能会影响效率甚至抛出Timeout Exception。如网络操作、数据库操作、文件IO操作

直接上代码,方便我们理解怎么通过Lazy类实现对象的延迟加载。

   class Program
{
static void Main(string[] args)
{
foreach (var item in Product.GetProductListLazy())
{
//下面的操作会执行Product类的构造函数
Product p = item.Value;
//构造函数执行完成
int id = item.Value.Id;
Console.WriteLine(id);
}
Console.ReadKey();
}
} public class Product
{
public int Id { set; get; }
public string Title { set; get; } public Product()
{
Thread.Sleep();
}
public static IList<Lazy<Product>> GetProductListLazy()
{
try
{
Console.WriteLine("非LazyLoad加载");
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff"));
Lazy<Product> product1 = new Lazy<Product>(() => new Product() { Id = , Title = "产品 1" });
Lazy<Product> product2 = new Lazy<Product>(() => new Product() { Id = , Title = "产品 2" });
Lazy<Product> product3 = new Lazy<Product>(() => new Product() { Id = , Title = "产品 3" });
return new List<Lazy<Product>> { product1, product2, product3 };
}
finally {
Console.WriteLine(DateTime.Now.ToString("HH:mm.ss.fff"));
}
} public static IList<Product> GetProductList()
{
try
{
Console.WriteLine("非LazyLoad加载");
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff"));
Product product1 = new Product() { Id = , Title = "产品 1" };
Product product2 = new Product() { Id = , Title = "产品 2" };
Product product3 = new Product() { Id = , Title = "产品 3" };
return new List<Product> { product1, product2, product3 };
}
finally {
Console.WriteLine(DateTime.Now.ToString("HH:mm.ss.fff"));
}
}
}

还有一种情况,我们知道多线程情况下的单件设计模式需要做数据同步的:

    public class Singleton
{
private static Singleton _Instance = new Singleton(); public static Singleton GetInstance()
{
return _Instance;
}
}

这样可以保证多线程的情况下,只有一个实例,因为是在程序加载时,初始化的对象,但是也正因为这样,失去了单件的一个优势,按需加载。

所以,我们可以这样实现:

    public class SingletonLazy
{
private static Lazy<SingletonLazy> _Instance = new Lazy<SingletonLazy>(); public static SingletonLazy GetInstance()
{
return _Instance.Value;
}
}

这样的话,可以保证有一个实例,同时实现延迟加载,按需加载。

以上内容介绍完了,欢迎大家交流和指正

另附:

参考文章:http://www.codeproject.com/Articles/612801/Lazy-Object-Initialization-with-System-Lazy-of-T-c

Demo下载:http://files.cnblogs.com/wpfworld/LazyLoadDemo.rar

System.Lazy<T>延迟加载的更多相关文章

  1. Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  2. Lazy Load, 延迟加载图片的 jQuery 插件.

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

  3. Hibernate lazy(延迟加载)

    Hibernat加载策略有两种,分别为即时加载和延迟加载(懒加载或者lazy),get使用的是即时加载,使用get获取数据时会立即查找(会先去缓存查找,如果缓存中没有找到,才会去数据库中查找),而lo ...

  4. RabbitMQ Lazy Queue 延迟加载

    Lazy Queue 在著名的单例设计模式中就有懒汉式的实现方式,也就是只有在你需要的时候我才去加载. 这让博主想到了以前上学的时候,每到了假期的假期作业,在假期的时候是从来不做的.只有在快开学老师要 ...

  5. Lazy Load, 延迟加载图片的 jQuery 插件【备忘】

    http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/ jQuery Unveil – 另一款非常轻量的延迟加载插件 http ...

  6. Lazy<T> 延迟加载

    namespace ConsoleAppTest { class Program { static void Main(string[] args) { Lazy<Student> stu ...

  7. .Net Framework 4.0: Using System.Lazy<T>

    原文发布时间为:2011-04-26 -- 来源于本人的百度文章 [由搬家工具导入] http://weblogs.asp.net/gunnarpeipman/archive/2009/05/19/n ...

  8. java:Hibernate框架4(延迟加载(lazy),抓取(fetch),一级缓存,get,load,list,iterate,clear,evict,flush,二级缓存,注解,乐观锁和悲观锁,两者的比较)

    1.延时加载和抓取: hibernate.cfg.xml: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-co ...

  9. AutoWired注解和Lazy延迟加载

    一.代码截图: @Lazy是延迟加载的意思, 容器启动时不创建对象, 当从容器中需要获取此对象时才创建. @Lazy//@Lazy注解可以用在类上, 还可以用在普通方法上,还可以用在构造方法上,还可以 ...

随机推荐

  1. Cordova打包vue项目(Android)

    准备工作: 安装好必要环境: vue-cli,webpack,node.js,android环境 (http://cordova.axuer.com/docs/zh-cn/latest/guide/p ...

  2. HBase使用教程

    1     基本介绍 1.1 前言 HBase – Hadoop Database.是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigta ...

  3. nextLine() 、nextInt()的跳过问题

    nextInt()  将输入的信息的下一个标记扫描为 int. nextLine() 此扫描器执行当前行,并返回跳过的输入信息. nextInt 会读取下面输入的 int类型的信息以回车作为结束,如果 ...

  4. HDU1087 Super Jumping! Jumping! Jumping! —— DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1087 Super Jumping! Jumping! Jumping! Time Limi ...

  5. eclipse自动创建项目出错Cannot change version of project facet Dynamic Web Module to 2.3.

    Cannot change version of project facet Dynamic Web Module to 2.3. step1:修改properties step2:修改web.xml ...

  6. java中字节数组byte[]和字符(字符串)之间的转换

    转自:http://blog.csdn.net/linlzk/article/details/6566124 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成by ...

  7. ruby gem的安装步骤

    第一步:下载安装文件 官网下载地址:http://rubyinstaller.org/downloads 第二步: 双击安装 在安装的时候,请勾选Add Ruby executables to you ...

  8. UI:简单的SQL语句

    一.SQL语句如果要在程序运行过程中操作数据库中的数据,那得先学会使用SQL语句1.什么是SQLSQL(structured query language):结构化查询语言SQL是一种对关系型数据库中 ...

  9. bzoj 2157: 旅游【树链剖分+线段树】

    裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...

  10. 洛谷 P3622 [APIO2007]动物园【状压dp】

    看成网络流建图想了好久... 实际上5个是可以状压的 设f[i][k]为到第i个围栏状态为k的方案数,因为考虑到重复,设g[i][k]记录i开始,状态为k的孩子有几个 状态转移很好想:f[j][k]= ...