一起谈.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框架也使用了这一技术。

目录
相关文章
|
5天前
|
监控 网络协议 API
.NET WebSocket 技术深入解析,你学会了吗?
【9月更文挑战第4天】WebSocket 作为一种全双工协议,凭借低延迟和高性能特点,成为实时应用的首选技术。.NET 框架提供了强大的 WebSocket 支持,使实时通信变得简单。本文介绍 WebSocket 的基本概念、.NET 中的使用方法及编程模型,并探讨其在实时聊天、监控、在线游戏和协同编辑等场景的应用,同时分享最佳实践,帮助开发者构建高效实时应用。
44 12
|
4天前
|
算法 Java 中间件
C#/.NET/.NET Core优质学习资料,干货收藏!
C#/.NET/.NET Core优质学习资料,干货收藏!
|
4天前
|
人工智能 开发框架 算法
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
|
4天前
|
缓存 开发框架 算法
C#/.NET这些实用的编程技巧你都会了吗?
C#/.NET这些实用的编程技巧你都会了吗?
|
8天前
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
35 6
|
4天前
|
传感器 应用服务中间件 Linux
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
|
4天前
|
人工智能 算法 C#
C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)
C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)
|
10天前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
13 2
|
4天前
|
JSON 测试技术 C#
C#/.NET/.NET Core优秀项目框架推荐榜单
C#/.NET/.NET Core优秀项目框架推荐榜单
|
4天前
|
开发框架 .NET Java
C#/.NET/.NET Core自学入门指南
C#/.NET/.NET Core自学入门指南