C#基礎概念之消極式載入

來源:互聯網
上載者:User

消極式載入,亦稱延遲執行個體化,延遲初始化等,主要表達的思想是,把對象的建立將會延遲到使用時建立,而不是在對象執行個體化時建立對象,即用時才載入。這種方式有助於提高於應用程式的效能,避免浪費計算,節省記憶體的使用等。針對於這種做法,似乎稱之為即用即建立更為合適些。

先來看一下在Framework4.0中如何?消極式載入。

Framework4.0提供了一個封裝類 Lazy,可以輕鬆的實現消極式載入。

  1. ///這行代碼錶明:要建立一個消極式載入的字串對象s  
  2. ///原型為LazyT> 對象名=new LazyT>(FunT>)  
  3. ///採用泛型委派進行構造,執行個體化此委託時要求必須是傳回值T類型的方法  
  4. ///如在本例中,T為string,則TestLazy.GetString方法的傳回值必須也是string類型  
  5. Lazystring> s = new Lazystring>(TestLazy.GetString); 

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

  1. public class TestLazy    
  2. {    
  3. public static string GetString()    
  4. {    
  5. return DateTime.Now.ToLongTimeString();    
  6. }   

可以通過IsValueCreated屬性來確定對象是否已建立,通過Value屬性來擷取當前對象的值。

  1. Console.WriteLine(s.IsValueCreated);//返回False  
  2. Console.WriteLine(s.IsValueCreated);//返回True

下面經出完整代碼,以供測試:

 

  1. class Program  
  2. {  
  3. static void Main(string[] args)  
  4. {  
  5. ///這行代碼錶明:要建立一個消極式載入的字串對象s  
  6. ///原型為Lazy 對象名=new Lazy(Fun)  
  7. ///採用泛型委派進行構造,執行個體化此委託時要求必須是傳回值T類型的方法  
  8. ///如在本例中,T為string,則TestLazy.GetString方法的傳回值必須也是string類型  
  9. Lazy s = new Lazy(TestLazy.GetString);  
  10. Console.WriteLine(s.IsValueCreated);//返回False  
  11. Console.WriteLine(s.IsValueCreated);//返回True  
  12. }  
  13. }  
  14. public class TestLazy  
  15. {  
  16. public static string GetString()  
  17. {  
  18. return DateTime.Now.ToLongTimeString();  
  19. }  
  20. }  

下面再用一個例子,示範消極式載入:

在這個例子中,使用了BlogUser對象,該對象包含多個Article對象,當載入BlogUser對象時,Article對象並不載入,當需要使用Article對象時,才載入。

 

  1. class Program  
  2. {  
  3. static void Main(string[] args)  
  4. {  
  5. BlogUser blogUser = new BlogUser(1);  
  6. Console.WriteLine("blogUser has been initialized");  
  7. {  
  8. Console.WriteLine(article.Title);}  
  9. }  
  10. }  
  11. public class BlogUser  
  12. {  
  13. public int Id { getprivate set; }  
  14. public Lazy> Articles { getprivate set; }  
  15. public BlogUser(int id)  
  16. {  
  17. this.Id = id;  
  18. Articles =new Lazy>(()=>ArticleServices.GetArticesByID(id));  
  19. Console.WriteLine("BlogUser Initializer");  
  20. }  
  21. }  
  22. public class Article  
  23. {  
  24. public int Id { getset; }  
  25. public string Title{get;set;}  
  26. public DateTime PublishDate { getset;}  
  27. public class ArticleServices  
  28. {  
  29. public static List GetArticesByID(int blogUserID)  
  30. {  
  31. List articles = new List {  
  32. new Article{Id=1,Title="Lazy Load",PublishDate=DateTime.Parse("2011-4-20")},  
  33. new Article{Id=2,Title="Delegate",PublishDate=DateTime.Parse("2011-4-21")},  
  34. new Article{Id=3,Title="Event",PublishDate=DateTime.Parse("2011-4-22")},  
  35. new Article{Id=4,Title="Thread",PublishDate=DateTime.Parse("2011-4-23}  
  36. };  
  37. Console.WriteLine("Article Initalizer");  
  38. return articles;  
  39. }  

運行結果示:

最後說一下,消極式載入主要應用情境:

當建立一個對象的子物件開銷比較大時,而且有可能在程式中用不到這個子物件,那麼可以考慮用消極式載入的方式來建立子物件。另外一種情況就是當程式一 啟動時,需要建立多個對象,但僅有幾個對象需要立即使用,這樣就可以將一些不必要的初始化工作延遲到使用時,這樣可以非常有效提高程式的啟動速度。

這種技術在ORM架構得到了廣泛應用,也並非C#專屬的,比如Java裡的Hibernate架構也使用了這一技術。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.