• 欢迎访问我爱CSharp学习网,这里有最新最全的C#书籍,C#视频。
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏我爱C#学习网吧
  • 推荐使用最新版Chrome浏览器和火狐浏览器访问本网站

C# 基础概念之延迟加载

C#杂烩 52csharp 359次浏览 0个评论 扫描二维码

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

  先来看一下在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;
   }
}

  运行结果如图示:

C# 基础概念之延迟加载

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

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

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



我爱CSharp学习网 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 基础概念之延迟加载
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址