C#中的延迟加载
什么是延迟加载?
延迟加载顾名思义就是:推迟加载的时机,当真正使用的时候才加载。
通常在创建一个大对象时,有些属性我们可以在使用到的时候才去创建(设置属性的值),这个可以有效的提升系统性能。
示例:
//定义了一个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> 有以下几点优势:
- 它具有 LazyThreadSafetyMode, 但是我们一般不使用它, 除非是很关键的情况下(在此略去181个字)
- 它使属性的定义行更加简单
- 从语义上来讲, 它更加明确, 更加具有可读性
- 它允许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#中的延迟加载的更多相关文章
- Mybatis中的延迟加载的使用方法
Mybatis中的延迟加载的使用方法 在Mybatis中查询订单,然后带出商品信息和快递信息的配置方法 orderMapper.xml配置如下 <?xml version="1.0&q ...
- 对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的?
对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的? 解答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.那么Hibernat ...
- Hibernate中的延迟加载及fetch
Hibernate中的延迟加载 1.类级别的查询策略: lazy : true(默认值) false(立即加载) 2.多对一关联的查询策略: lazy: proxy(默认值) no-proxy ...
- 在mybatis框架中,延迟加载与连表查询的差异
1.引子 mybatis的延迟加载,主要应用于一个实体类中有复杂数据类型的属性,包括一对一和一对多的关系(在xml中用collection.association标签标识).这个种属性往往还对应着另一 ...
- mybatis中的延迟加载
一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先 ...
- Swift中的延迟加载(懒加载)
Swift方式的延迟加载 而在Swift中,你只需一行代码即可实现此机制: lazy var players = String[]() 简单.简洁,直入主题. 但你得记住,你必须使用var关键字来定义 ...
- SSH中使用延迟加载报错Exception occurred during processing request: could not initialize proxy - no Session
17:40:17,249 ERROR DefaultDispatcherErrorHandler:42 - Exception occurred during processing request: ...
- 【Hibernate】浅析hibernate中的延迟加载
1 简介 在使用一些查询方法时,方法执行了,但是并没有立刻发送SQL语句查询数据库.而是在访问对象的getXxx方法时候才触发SQL执行加载对象数据.这种机制就称为延迟加载. 2 优点 延迟加载主要是 ...
- 如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?
延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.Hibernate使用了虚拟代理机制实现延迟加载,我们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载 ...
随机推荐
- uva10106(大数乘法)
public class Product { public static void main(String[] args){ Scanner sc = new Scanner(new Buffered ...
- The 2015 China Collegiate Programming Contest H. Sudoku hdu 5547
Sudoku Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- Leetcode ReorderList
Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...
- Jquery实现下拉联动表单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基
一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...
- qt编译常见错误
一.fatal error: QWidget: 没有那个文件或目录 类似于找不到文件目录的,在.pro文件中添加 QT +=\ widgets 类似就可以编译通过
- windows2008 IIS下配置FTP服务
一.服务器管理器 1.2008的系统使用服务器管理器,选择角色,因为我之前已经开启了IIS服务器角色,所以我现在只要添加角色服务即可,如果你没有开启过的话,直接添加角色即可. 2.选择WEB服务器,打 ...
- VS开发好用的扩展
VS开发好用的扩展(转) 转自:http://www.haogongju.net/art/1977373 首先为大家介绍一下开发字体,做程序开发,代码可读性,在侧面也能帮助开发提高效率,所以给大家介绍 ...
- 转载:C# this.Invoke()的作用与用法 理解三
Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); 在多线程编程中,我们经常要在工作线程 ...
- unity3d插件Daikon Forge GUI 中文教程6-高级控件richtextlabel的使用
3.5.richtextlabel文本 可以像Word文档一样编辑出多样的内容,图片,字体颜色大小下划线.超链接背景等等. Defaults: 默认字体 默认图集 Blank Texture :空白的 ...