什么是延迟加载?  

  延迟加载顾名思义就是:推迟加载的时机,当真正使用的时候才加载

  通常在创建一个大对象时,有些属性我们可以在使用到的时候才去创建(设置属性的值),这个可以有效的提升系统性能。

示例:

//定义了一个Hero类型
public class Hero
{
public string Name{get;set;} public string FullName{get;set;} public Skill objSkill; public Hero(string name)
{
Name=name;
FullName="Super "+name;
objSkill=new Skill(name);
}
} //定义一个Skill类型
public class Skill
{
public string Name{get;set;} public int Power{get;set;} public Skill(string name)
{
Name=name;
Power=name.Length;
}
} public class Program
{
public static void Main(string[] args)
{
Hero hero=new Hero("qi da sheng");
//此时我只想获取Hero的FullName,但是同时调用Skill的构造方法,加载了Skill的属性,
//初始化Skill需要在内存中开辟一定的空间,造成没必要的空间浪费
Console.WriteLine(hero.FullName); //思考:如果实现在调用Skill.Name的时候才去真正创建Skill对象呢?
}
}

改进一

改进一:
//定义了一个Hero类型
public class Hero
{
public string Name{get;set;} public string FullName{get;set;} //public Skill objSkill;
private Skill _skill; public Skill objSkill
{
get {return _skill??(new _skill(Name));}
} public Hero(string name)
{
Name=name;
FullName="Super "+name;
//objSkill=new Skill(name);
}
} //定义一个Skill类型
public class Skill
{
public string Name{get;set;} public int Power{get;set;} public Skill(string name)
{
Name=name;
Power=name.Length;
}
} public class Program
{
public static void Main(string[] args)
{
Hero hero=new Hero("qi da sheng");
//此时获取Hero的FullName时并不会去创建Skill的实例
Console.WriteLine(hero.FullName);
//真正用到Skill.Name时才会创建Skill的实例,从而实现了延迟加载效果?
Console.WriteLine(hero.ObjSkill.Power); //思考2:有没有其他更好的方法?
}
}

改进二

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Demo_Lazy
{
//定义了一个Hero类型
public class Hero
{
public string Name { get; set; } public string FullName { get; set; } private readonly Lazy<Skill> skill; public Skill objSkill
{
get { return skill.Value; }
} public Hero(string name)
{
Name = name;
FullName = "Super " + name;
skill = new Lazy<Skill>(() => new Skill(Name));
}
} //定义一个Skill类型
public class Skill
{
public string Name { get; set; } public int Power { get; set; } public Skill(string name)
{
Name = name;
Power = name.Length;
}
} public class Program
{
public static void Main(string[] args)
{
Hero hero = new Hero("qi da sheng");
//此时获取Hero的FullName时并不会去创建Skill的实例
Console.WriteLine(hero.FullName);
//真正用到Skill.Name时才会创建Skill的实例,从而实现了延迟加载效果
Console.WriteLine(hero.objSkill.Power); Console.Read();
}
} }

Lazy<T>的优势

那么既然我们已经可以用属性缓存的方法实现, 为什么还要引入Lazy<T> ?

至少Lazy<T> 有以下几点优势:

  1. 它具有 LazyThreadSafetyMode, 但是我们一般不使用它, 除非是很关键的情况下(在此略去181个字)
  2. 它使属性的定义行更加简单
  3. 从语义上来讲, 它更加明确, 更加具有可读性
  4. 它允许null为有效值

参考:

http://www.cnblogs.com/multiplesoftware/archive/2011/11/24/2261105.html

https://msdn.microsoft.com/en-us/library/dd642331(v=vs.110).aspx

C#中的延迟加载的更多相关文章

  1. Mybatis中的延迟加载的使用方法

    Mybatis中的延迟加载的使用方法 在Mybatis中查询订单,然后带出商品信息和快递信息的配置方法 orderMapper.xml配置如下 <?xml version="1.0&q ...

  2. 对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的?

    对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的? 解答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.那么Hibernat ...

  3. Hibernate中的延迟加载及fetch

    Hibernate中的延迟加载 1.类级别的查询策略: lazy  :  true(默认值) false(立即加载) 2.多对一关联的查询策略: lazy:  proxy(默认值) no-proxy ...

  4. 在mybatis框架中,延迟加载与连表查询的差异

    1.引子 mybatis的延迟加载,主要应用于一个实体类中有复杂数据类型的属性,包括一对一和一对多的关系(在xml中用collection.association标签标识).这个种属性往往还对应着另一 ...

  5. mybatis中的延迟加载

    一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先 ...

  6. Swift中的延迟加载(懒加载)

    Swift方式的延迟加载 而在Swift中,你只需一行代码即可实现此机制: lazy var players = String[]() 简单.简洁,直入主题. 但你得记住,你必须使用var关键字来定义 ...

  7. SSH中使用延迟加载报错Exception occurred during processing request: could not initialize proxy - no Session

    17:40:17,249 ERROR DefaultDispatcherErrorHandler:42 - Exception occurred during processing request: ...

  8. 【Hibernate】浅析hibernate中的延迟加载

    1 简介 在使用一些查询方法时,方法执行了,但是并没有立刻发送SQL语句查询数据库.而是在访问对象的getXxx方法时候才触发SQL执行加载对象数据.这种机制就称为延迟加载. 2 优点 延迟加载主要是 ...

  9. 如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?

    延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.Hibernate使用了虚拟代理机制实现延迟加载,我们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载 ...

随机推荐

  1. oracle sql别名

    为sql的字段起一个别名,常以为是可有可无的,但是有时候是必要的. 例如在ibatis中 <!-- 获取已发或待发送的彩信记录列表 --> <resultMap id="m ...

  2. NoSql之MongoDB--Ubuntu下安装

    MongoDB只提供了64位LTS(长期支持)Ubuntu发行版的packages.例如,12.04 LTS,14.04 LTS,16.04 LTS等等. 1.导入被包管理系统使用的公钥 Ubuntu ...

  3. matlab中各种高斯相关函数

    matlab中各种高斯相关函数 matlab, 高斯函数, 高斯分布 最常见的是产生服从一维标准正态分布的随机数 n=100;  x=randn(1,n)  实现服从任意一维高斯分布的随机数 u=10 ...

  4. Java 生产者模式 消费者模式

    // The standard idiom for calling the wait synchronized(sharedObject) { while(condition){ sharedObje ...

  5. [Leetcode] Recover Binary Search Tree

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  6. POJ-A Simple Problem with Integers

    Description 给出了一个序列,你需要处理如下两种询问. "C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000). " ...

  7. UIView常见属性总结

    一 UIVIew 常见属性 .frame 位置和尺寸(以父控件的左上角为原点(,)) .center 中点 (以父控件的左上角为原点(,)) .bounds 位置和尺寸(以自己的左上角为原点 (,)) ...

  8. Objective-c的内存管理MRC与ARC

    Objective-c的内存管理MRC与ARC   Objective-c中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Referen ...

  9. IOS 学习资料

    IOS学习资料 - 逆天整理 - 精华无密版[最新][精华] 无限互联3G学院 iOS开发视频教程UI 极客学院IOS iPhone 6的自适应布局

  10. thinkphp添加空数据的解决办法

    thinkphp真是个麻烦的东西,各种小问题,其中字段映射的表单名不能与数据库的字段名称相同,否则会添加空数据! 还有自动完成的名称要与字段映射后的名称相同,否则自动完成不会起作用! 还有自动验证的字 ...