一起谈.NET技术,C# 基础概念之延迟加载

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

  先来看一下在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属性来获取当前对象的值。


Console.WriteLine(s.IsValueCreated);//返回False
Console.WriteLine(s.Value); //返回s的当前值
Console.WriteLine(s.IsValueCreated);//返回True

  下面经出完整代码,以供测试:

  字符串对象延迟加载完整示例:


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(1);
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=1,Title="Lazy Load",PublishDate=DateTime.Parse("2011-4-20")},
new Article{Id=2,Title="Delegate",PublishDate=DateTime.Parse("2011-4-21")},
new Article{Id=3,Title="Event",PublishDate=DateTime.Parse("2011-4-22")},
new Article{Id=4,Title="Thread",PublishDate=DateTime.Parse("2011-4-23")}
};
Console.WriteLine("Article Initalizer");
return articles;
}
}

  运行结果如图示:

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

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

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

时间: 2024-08-28 05:30:41

一起谈.NET技术,C# 基础概念之延迟加载的相关文章

C#基础概念之延迟加载

延迟加载,亦称延迟实例化,延迟初始化等,主要表达的思想是,把对象的创建将会延迟到使用时创建,而不是在对象实例化时创建对象,即用时才加载.这种方式有助于提高于应用程序的性能,避免浪费计算,节省内存的使用等.针对于这种做法,似乎称之为即用即创建更为合适些. 先来看一下在Framework4.0中如何实现延迟加载. Framework4.0提供了一个包装类 Lazy,可以轻松的实现延迟加载. ///这行代码表明:要创建一个延迟加载的字符串对象s   ///原型为LazyT> 对象名=new LazyT

【Alljoyn】Alljoyn学习笔记五 AllJoyn开源技术基础概念解析

AllJoyn开源技术基础概念解析 摘要: 总线(Bus) 实现P2P通信的基础 AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus 总线附件(Bus Attachment) 每一个连接到总线上的Alljoyn应用程序被称为总线附件,可用C++或Java编写 每个总线附件 ... 总线(Bus) 实现P2P通信的基础 AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus总线附件(Bus Attachment) 每一个连接到总线上的Alljoy

.NET简谈互操作(三:基础知识之DllImport特性)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之释放非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用) .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习,上一篇文章中我们介绍了托管代码怎么与非托管代码C++之间的互操作:要想在托管代码中成功的进行非托管调用,要注意的细

.NET简谈互操作(四:基础知识之Dispose非托管内存)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用)  .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.前一篇文章中我们学习了基础知识中的DllImport关键特性:我们继续学习基础知识中的内存释放相关技术

WCF分布式开发步步为赢(1):WCF分布式框架基础概念

众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推出了自己的中间件产品,比如Oracle Fusion和 SAP NetWeaver,IBM.BEA等企业也推出了自己基于SOA的解决方案.基于J2EE平台的SOA架构设计中的一个重要概念就是EJB企业服务总线,作用是实现各个系统的数据交互.而.NET平台上,WCF就是微软为各个系统的数据交互提供通讯

Java编程一定要搞清29个基础概念

  Java的白皮书为我们提出了Java编程语言的11个关键特性.这11个关键特性就是Java一定要搞清的29个基础概念. (1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb.并不是说这个语言就而一定比哪个好,51CTO也曾特别推荐过"C#与C++谁更强?还是关公战秦琼",对于初学者来说,您想选择好的语言进行学习,可以参看51CTO编辑特别推荐的

方法-初学的IT女孩,求正确解答JAVA基础概念

问题描述 初学的IT女孩,求正确解答JAVA基础概念 在面向对象编程里,每个对象...选择下面一个正确选项: a. 是另一个对象的一个属性 b. 是一个类的一个实例 c. 继承一个类 d. 具有递归方法 选择正确的语句或者JAVA里关于面向对象编程的语句(多选题) ? 继承模型IS-A关系,其中子类的对象还是超类的对象. ? 在一个超类里的方法的数量总是高于其每一个子类 ? 同样的超类的两个子类总是有相同数量的方法. 在JAVA里选择正确的关于可见度的答案.当一个属性(实例变量)在一个类里被定义

《深入学习VMware vSphere 6》——第1章 vSphere虚拟化基础与规划 1.1虚拟化基础概念

第1章 vSphere虚拟化基础与规划 本章介绍虚拟化基础知识,介绍在虚拟化项目中服务器.存储.交换机的选择与规划,介绍常用网络配置命令.主流服务器的RAID配置等内容.初次学习虚拟化的用户,需要仔细阅读本章内容. 1.1 虚拟化基础概念 如果第一次接触虚拟机并想尝试使用虚拟机软件,可能有许多的疑问.本节主要回答初学者容易混淆或者不清楚的问题,让初学者了解虚拟机.虚拟化与云计算的基础知识. 1.1.1 什么是虚拟机 虚拟机是一台"软件"计算机,确切地说,虚拟机是一种严密隔离的软件容器,

谷歌设计师出品的VR设计指南之基础概念与设计工具

  在本文的第二部分当中,我们来了解一些作为设计师需要掌握的VR基础概念及相关设计工具.我们不会探索的过于深入,面向设计师的职能点到为止即可. 新的空间维度与沉浸式体验所带来的冲击是前所未有的.要在三维世界当中打造令人舒适的互动体验,你需要了解一些此前可能并未接触过的设计与技术原则.我们的Cardboard团队将一系列概念知识打包到了Cardboard Design Lab这款app(Android)当中,你可以配合Cardboard沉浸到VR世界当中进行学习. 此外还要记得观看Alex在201