什么是延迟加载?  

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

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

示例:

//定义了一个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执行计划

    建立与oracle的web程序,经常性出现sql性能不高导致的问题,比如程序好好的突然数据库查询变得很慢,几乎加载不了,这时候就有可能是oracle查询计划出错的原因. <sql id=&quo ...

  2. lua 获取文件名和扩展名

    local str = "aaa.bbb.bbb.txt" --获取文件名 function getFileName(str) local idx = str:match(&quo ...

  3. OpenResty 安装 drizzle-nginx-module

    1.下载drizzle模块 wget http://openresty.org/download/drizzle7-2011.07.21.tar.gz 2.安装drizzle模块 tar zxvf d ...

  4. Leetcode Sqrt(x)

    参考Babylonian method  (x0  越接近S的平方根越好) class Solution { public: int sqrt(double x) { ) ; , tolerance ...

  5. 如何伪装成为一名前端(JS方向)

    作为一个菜鸟级别的.NET开发者,在连服务器都没搞定的情况下,要研究前端,这是在扯淡,不过,迫于工作的需要,时常需要去前端打杂,所以经常伪装成为一名前端,有时候竟产生错觉,去应聘Y一份前端work吧. ...

  6. 【BZOJ】3434: [Wc2014]时空穿梭

    http://www.lydsy.com/JudgeOnline/problem.php?id=3434 题意:n维坐标中要找c个点使得c个点在一条线上且每一维的坐标单调递增且不能超过每一维限定的值m ...

  7. iOS 发布遇到的问题 (转载)

    1.ios图片命名Icon-120.png – 120×120 iphone & ipod touch(ios7)  http://blog.csdn.net/xyxjn/article/de ...

  8. PostgreSQL新手入门

    自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. 本文介绍PostgreSQL的安装和基本用法,供初次使用者上手.以下内容基于Debian操作系统,其他操作系 ...

  9. 学习bootstrap心得

    Bootstrap 使用了一些 HTML5 元素和 CSS 属性.为了让这些正常工作,您需要使用 HTML5 文档类型(Doctype). 因此,请在使用 Bootstrap 项目的开头包含下面的代码 ...

  10. passing ‘const ’ as ‘this’ argument of ‘’ discards qualifiers 错误处理

    示例程序: #include <iostream> #include <set> using   namespace std ; class   StudentT { publ ...