什么是延迟加载?  

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

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

示例:

//定义了一个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. js 的try catch应用

    <script language="javascript"> try { throw new Error(10,"asdasdasd") } cat ...

  2. CUDA程序设计(二)

    算法设计:直方图统计 直方图频数统计,也可以看成一个字典Hash计数.用处不是很多,但是涉及CUDA核心操作:全局内存.共享内存.原子函数. 1.1  基本串行算法 这只是一个C语言练习题. #def ...

  3. BZOJ4515: [Sdoi2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  4. XCode编译文件过多导致内存吃紧解决方法

    XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧

  5. JS调用水晶报表打印翻页按钮事件

    默认的水晶报表打印按钮.翻页按钮太小,并且样式不好调整,考虑自己做一个按钮,然后调用水晶报表的按钮事件. 在实际操作中发现可以在.net按钮的服务器端事件中调用翻页方法: CrystalReportV ...

  6. VS2010与水晶报表V13的打包集成小结

    感谢孟子E章提供的技术咨询. 系统配置: Windows 7 + VS2010 , WinForm + DotNet4 + 水晶报表 这里说的打包集成,指的用VS2010的制作的安装包,在安装的时候可 ...

  7. ArcGIS几种数据格式

    ArcGIS几种数据格式 ArcInfo常用以下格式的数据:shp.Coverage..Raster CAD和Geodatabase.各种数据的组织形式不一样,其中shp.Coverage.Raste ...

  8. Lanterns

    Lanterns 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=86640#problem/B 题目: Description ...

  9. Stereo Matching 立体匹配学习资料

    Middlebury Stereo Evaluation Camera Calibration and 3D Reconstruction OpenCV学习笔记(18)双目测距与三维重建的OpenCV ...

  10. java-两个大数相加

    题目要求:用字符串模拟两个大数相加. 一.使用BigInteger类.BigDecimal类 public static void main(String[] args) { String a=&qu ...