延迟加载,亦称延迟实例化,延迟初始化等,主要表达的思想是,把对象的创建将会延迟到使用时创建,而不是在对象实例化时创建对象,即用时才加载。这种方式有助于提高于应用程序的性能,避免浪费计算,节省内存的使用等。针对于这种做法,似乎称之为即用即创建更为合适些。

先来看一下在Framework4.0中如何实现延迟加载。

Framework4.0提供了一个包装类 Lazy<T>,可以轻松的实现延迟加载。

///这行代码表明:要创建一个延迟加载的字符串对象s
///原型为Lazy<T> 对象名=new Lazy<T>(Fun<T>)
///采用泛型委托进行构造,实例化此委托时要求必须是返回值T类型的方法
///如在本例中,T为string,则TestLazy.GetString方法的返回值必须也是string类型
Lazy<string> s = new Lazy<string>(TestLazy.GetString);

本例中TestLazy.GetString()方法如下示:

public class TestLazy
{
public static string GetString()
{
return DateTime.Now.ToLongTimeString();
}
}

可以通过IsValueCreated属性来确定对象是否已创建,通过Value属性来获取当前对象的值。

字符串对象延迟加载完整示例
class Program
{
static void Main(string[] args)
{ ///这行代码表明:要创建一个延迟加载的字符串对象s
///原型为Lazy<T> 对象名=new Lazy<T>(Fun<T>)
///采用泛型委托进行构造,实例化此委托时要求必须是返回值T类型的方法
///如在本例中,T为string,则TestLazy.GetString方法的返回值必须也是string类型
Lazy<string> s = new Lazy<string>(TestLazy.GetString);
Console.WriteLine(s.IsValueCreated);//返回False
Console.WriteLine(s.Value); //返回S的当前值
Console.WriteLine(s.IsValueCreated);//返回True
} }
public class TestLazy
{
public static string GetString()
{
return DateTime.Now.ToLongTimeString();
}
}

下面再用一个例子,演示延迟加载。

在这个例子中,使用了BlogUser对象,该对象包含多个Article对象,当加载BlogUser对象时,Article对象并不加载,当需要使用Article对象时,才加载。

包含子对象的延迟加载
class Program
{
static void Main(string[] args)
{ BlogUser blogUser = new BlogUser();
Console.WriteLine("blogUser has been initialized"); foreach (var article in blogUser.Articles.Value)
{
Console.WriteLine(article.Title);
} } } public class BlogUser
{
public int Id { get; private set; }
public Lazy<List<Article>> Articles { get; private set; }
public BlogUser(int id)
{
this.Id = id;
Articles =new Lazy<List<Article>>(()=>ArticleServices.GetArticesByID(id));
Console.WriteLine("BlogUser Initializer");
} }
public class Article
{
public int Id { get; set; }
public string Title{get;set;}
public DateTime PublishDate { get; set; }
}
public class ArticleServices
{
public static List<Article> GetArticesByID(int blogUserID)
{
List<Article> articles = new List<Article> {
new Article{Id=,Title="Lazy Load",PublishDate=DateTime.Parse("2011-4-20")},
new Article{Id=,Title="Delegate",PublishDate=DateTime.Parse("2011-4-21")},
new Article{Id=,Title="Event",PublishDate=DateTime.Parse("2011-4-22")},
new Article{Id=,Title="Thread",PublishDate=DateTime.Parse("2011-4-23")}
};
Console.WriteLine("Article Initalizer");
return articles;
}
}

运行结果如图示:

aaarticlea/png;base64,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" alt="" />

最后说一下,延迟加载主要应用场景

当创建一个对象的子对象开销比较大时,而且有可能在程序中用不到这个子对象,那么可以考虑用延迟加载的方式来创建子对象。另外一种情况就是当程序一启动时,需要创建多个对象,但仅有几个对象需要立即使用,这样就可以将一些不必要的初始化工作延迟到使用时,这样可以非常有效的提高程序的启动速度。

这种技术在ORM框架得到了广泛应用,也并非C#独有的,比如Java里的Hibernate框架也使用了这一技术。

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

  1. 【Win 10应用开发】延迟加载图片的另一种方法

    上一篇文章中老周给大伙介绍了x:Phase和x:Bind的用法,并演示了一个延迟加载的示例.不过,那个例子会遗留一个问题,就是UI线程被阻塞,所以启动应用较慢. 如果希望图片可以延迟加载,或许我们可以 ...

  2. 学习EF之贪懒加载和延迟加载(2)

    通过昨天对EF贪婪加载和延迟加载的学习,不难发现,延迟加载还是很好用的,但是问题也就来了,有的时候我们只需要加载一个实体,不需要和他相关的外部实体,这时候我们来看看EF延迟加载时怎么作用的吧 打开pr ...

  3. 学习EF之贪婪加载和延迟加载(1)

    从暑假开始接触code first以来,一直感觉很好用,主要在于开发过程中以业务为中心可以随时修改数据模型生成数据库,还有一个原因就是查询起来很方便 这里找了一个以前database first的一段 ...

  4. jQuery图片延迟加载

    这里延迟加载的意思是,拖动滚动条时,在图片出现在浏览器显示区域后才加载显示.在这之前全部图片都由一张图片代替.节省流量,减轻服务器负担. 效果展示 http://hovertree.com/texia ...

  5. Hibernnate延迟加载策略(这么详细你还看不懂)

    好久没有认真写过博客了,今天就好好的写一篇吧!!!!!!!!! 当Hibernate 从数据库中加载某个对象(例如:Dept对象)时,如果同时自动加载所有的关联的某个对象(例如:Emp对象),而程序实 ...

  6. 延迟加载外部js文件,延迟加载图片(jquery.lazyload.js和echo,js)

    js里一说到延迟加载,大都离不开两种情形,即外部Js文件的延迟加载,以及网页图片的延迟加载: 1.首先简单说一下js文件的3种延迟加载方式: (1)<script type="text ...

  7. MyBatis 延迟加载,一级缓存,二级缓存设置

    什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...

  8. Lazy Load, 延迟加载图片的 jQuery 插件.

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

  9. js图片延迟加载

    什么是图片延迟加载? 也叫懒加载. 当页面有多屏的时候,页面中的图片比较多. 那么,在页面载入完毕的时候,并不会把所有的图片都加载进来. 而是当用户拖动滚动条的时候,图片要进入用户的视野了,才开始加载 ...

  10. Hibernate之lazy延迟加载

    一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...

随机推荐

  1. 借助Glances Monitor,密切关注你的系统

    两种方法安装 glances 通常可以有两种方法安装 glances.第一种是通过编译源代码的方式,这种方法比较复杂另外可能会遇到软件包依赖性问题.还有一种是使用特定的软件包管理工具来安装 glanc ...

  2. 免费的网络扫描器-Advanced IP Scanner

    软件会自动检测电脑所在的网段,自动决定扫描范围.(例如电脑IP是192.168.1.101,扫描范围就是192.168.1.*) 官方网站:http://www.advanced-ip-scanner ...

  3. AJAX-----15HTML5实现进度条上传

    目的当然还是为了提高用户的体验度嘛,, 废话不多说走码.... <!DOCTYPE html> <html lang="en"> <head> ...

  4. little alchemy攻略

    一个造物游戏: acidrain=rain+smoke airlplain=metal+bird alcohol=fruit+time algae=plant+water allergy=dust+h ...

  5. 使用Jquery解析Json基础知识

    前言 在WEB数据传输过程中,json是以文本,即字符串的轻量级形式传递的,而客户端一般用JS操作的是接收到的JSON对象,所以,JSON对象和JSON字符串之间的相互转换.JSON数据的解析是关键. ...

  6. Windows:常见问题

    1.文件(夹)非法字符 Windows系统文件(夹)非法字符"\\/:*?\"<>|",不包含‘.’,但"."字符不能是文件(夹)的首字符 ...

  7. 升级PHP

     wget http://down.wdlinux.cn/in/php_up53.shsh php_up53.sh 

  8. [问题2015S08] 复旦高等代数 II(14级)每周一题(第九教学周)

    [问题2015S08]  设 \(A\) 为 \(n\) 阶复方阵, 证明: \(A\overline{A}\) 与 \(\overline{A}A\) 相似, 其中 \(\overline{A}\) ...

  9. SpringMvc xml 配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...

  10. Java开发中经典的小实例-(字符串倒序输出)

    public class Test12 {    public static void main(String[] args) {        // TODO Auto-generated meth ...