在很多情況下,有些對象需要在使用時加載或根據邏輯動態加載。有些情況如果不延遲加載,可能會影響效率甚至拋出Timeout Exception。如網絡操作、數據庫操作、文件IO操作
直接上代碼,方便我們理解怎么通過Lazy類實現對象的延遲加載。
class Program { static void Main(string[] args) { foreach (var item in Product.GetProductListLazy()) { //下面的操作會執行Product類的構造函數 Product p = item.Value; //構造函數執行完成 int id = item.Value.Id; Console.WriteLine(id); } Console.ReadKey(); } } public class Product { public int Id { set; get; } public string Title { set; get; } public Product() { Thread.Sleep(5000); } public static IList<Lazy<Product>> GetProductListLazy() { try { Console.WriteLine("非LazyLoad加載"); Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff")); Lazy<Product> product1 = new Lazy<Product>(() => new Product() { Id = 1, Title = "產品 1" }); Lazy<Product> product2 = new Lazy<Product>(() => new Product() { Id = 2, Title = "產品 2" }); Lazy<Product> product3 = new Lazy<Product>(() => new Product() { Id = 3, Title = "產品 3" }); return new List<Lazy<Product>> { product1, product2, product3 }; } finally { Console.WriteLine(DateTime.Now.ToString("HH:mm.ss.fff")); } } public static IList<Product> GetProductList() { try { Console.WriteLine("非LazyLoad加載"); Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff")); Product product1 = new Product() { Id = 1, Title = "產品 1" }; Product product2 = new Product() { Id = 1, Title = "產品 2" }; Product product3 = new Product() { Id = 1, Title = "產品 3" }; return new List<Product> { product1, product2, product3 }; } finally { Console.WriteLine(DateTime.Now.ToString("HH:mm.ss.fff")); } } }
還有一種情況,我們知道多線程情況下的單件設計模式需要做數據同步的:
public class Singleton { private static Singleton _Instance = new Singleton(); public static Singleton GetInstance() { return _Instance; } }
這樣可以保證多線程的情況下,只有一個實例,因為是在程序加載時,初始化的對象,但是也正因為這樣,失去了單件的一個優勢,按需加載。
所以,我們可以這樣實現:
public class SingletonLazy { private static Lazy<SingletonLazy> _Instance = new Lazy<SingletonLazy>(); public static SingletonLazy GetInstance() { return _Instance.Value; } }
這樣的話,可以保證有一個實例,同時實現延遲加載,按需加載。
以上內容介紹完了,歡迎大家交流和指正
另附:
參考文章:http://www.codeproject.com/Articles/612801/Lazy-Object-Initialization-with-System-Lazy-of-T-c