在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载。有些情况如果不延迟加载,可能会影响效率甚至抛出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. C++中各大有名的科学计算库

    在 C++中,库的地位是非常高的.C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论.现实中,C++的库门类繁多,解决 的问题也是极其广泛,库从轻量 ...

  2. C中使用memset

    int i; cout<<memset(&i,1,sizeof(int))<<endl; 输出结果是16843009,而不是填充的1111 1111,为什么呢? 因为m ...

  3. JAVA程序员常用软件整理

    Java类软件:-------------------------------JDK7.0:http://pan.baidu.com/s/1jGFYvAYMyclipse8.5破解版:http://p ...

  4. js常用操作事件

    触发描述 方法 用法 点击 onclick="method();"   变换 onchange="testChange();"   双击 ondblclick= ...

  5. adbi命令【转】

    本文转载自:https://zmywly8866.github.io/2015/01/24/all-adb-command.html   ADB很强大,记住一些ADB命令有助于提高工作效率. 获取序列 ...

  6. AngularJS 指令(Directives)实践指南

    指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令.这篇教程会为你讲述如何自定义指令,以及介绍如何在 ...

  7. 洛谷 P1313 计算系数 —— 水题

    题目:https://www.luogu.org/problemnew/show/P1313 不就是...C(k,n) * an * bm . 代码如下: #include<iostream&g ...

  8. FLASH OTP

    OTP 软件加密运用参考 为了防止软件被他人盗用,spansion flash给每个芯片植入了代表身份的unique ID,增加了OTP扇区,目前我们可以运用这两个特性,来实现软件的加密保护.软件加密 ...

  9. js中&&与||

    1.a&&b 先将a.b转化为Boolean型,在进行逻辑运算,true 返回b,false 返回a: 2.a||b 先将a.b转化为Boolean型,在进行逻辑运算,true 返回a ...

  10. 洛谷P4374 [USACO18OPEN]Disruption(树链剖分+线段树)

    传送门 不难发现,每一条额外修的路径,会对原树上$(u,v)$路径上的所有边产生贡献 于是这就变成了一个路径修改 那么我们把每一条边赋值到它连接的两个点中深度较大的那个上面,然后每一次用树剖+线段树做 ...