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

先来看一下在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. ADO.NET 新特性之SqlBulkCopy

    在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们 ...

  2. Dynamics AX 2012 R3 Demo 安装与配置 - 编译和配置 (Step 3)

        在前两节中,Reinhard主要讲解了如何配置安装环境,安装数据库服务器,AOS和客户端.至此安装工作已经结束,下面Reinhard开始讲解如何编译和配置.     运行客户端后,系统弹出初始 ...

  3. JSP页面嵌套

    项目中审批过程需要将业务表单嵌套在审批的页面中.由于业务表单很多,前台已经axjx到了本次选择的表单的地址.本来做的就是把这个链接放在审批页面上,但现在需求的就是直接把这个biz表单嵌套在审批的页面中 ...

  4. 一个注解方式webSocket demo

    前段时间在研究websocket.其中遇到了一些bug.这里跟大家分享这过程. 首先介绍一下websocket WebSocket是HTML5的一种新协议,实现了浏览器和服务器的双全工通信,能更好的节 ...

  5. Python Locust性能测试框架实践

    [本文出自天外归云的博客园] Locust的介绍 Locust是一个python的性能测试工具,你可以通过写python脚本的方式来对web接口进行负载测试. Locust的安装 首先你要安装pyth ...

  6. Android的UI设计

    一.Android控件 1.TextView 属性:id.width.height.gravity(对齐方式).textSize(文字大小).textColor(文字颜色) 2.Button 属性:i ...

  7. 我的android学习经历38

    anddroid studio的内存修改 昨天有位朋友问到了下面的一个问题 这个判断为android studio的分配的内存不够用. 据我的了解造成这个的原因主要有以下几个方面: 1.电脑的内存本来 ...

  8. 【转载】详解CreateProcess调用内核创建进程的过程

    原文:详解CreateProcess调用内核创建进程的过程 昨天同学接到了腾讯的电面,有一题问到了CreateProcess创建进程的具体实现过程,他答得不怎么好吧应该是, 为了以防万一,也为了深入学 ...

  9. sqlite创建表

    create table bike (id ) primary key, password ));

  10. Determining Current Block and Current Item in Oracle Forms

    SYSTEM.CURSOR_BLOCK Determining current block in Oracle Forms Using SYSTEM.CURSOR_BLOCK system varia ...