lazy initialization
延遲初始化 (Lazy Initialization),在解決大對象的創建開銷時,很有用。我(尋自己)以前碰到 延遲初始化 (Lazy Initialization) 的時候,一直都是理解的不是太透徹,今天決定徹底的認識下 延遲初始化 (Lazy Initialization)。
1.定義
一個對象的延遲初始化 (Lazy Initialization)意味著該對象的創建將會延遲至第一次使用該對象時。延遲初始化 (Lazy Initialization)主要用于提高性能,避免浪費計算,并減少程序內存要求。(延遲初始化=延遲實例化)
2.理解
在 .Net 4.0 中,可以通過 Laze<Object> 來快速的構建,但是,很不幸,沒有裝 .Net Framework 4.0,況且,這樣的方法,不利于我們理解其中的原理,下面一段經典的代碼,最能說明延遲初始化 (Lazy Initialization):
01 |
public sealed class Singleton |
02 |
{ |
03 |
Singleton() { } |
04 |
|
05 |
public static Singleton Instance |
06 |
{ |
07 |
get |
08 |
{ |
09 |
return Nested.instance; |
10 |
} |
11 |
} |
12 |
|
13 |
class Nested |
14 |
{ |
15 |
static Nested() { } |
16 |
|
17 |
internal static readonly Singleton instance = new Singleton(); |
18 |
} |
19 |
} |
3.應用場景
以下是最常見的方案:有一個對象的創建開銷很大,而程序可能不會使用它。例如,假定您在內存中有一個Customer 對象,該對象的 Orders 屬性包含一個很大的 Order 對象數組,該數組需要數據庫連接以進行初始化。如果用戶從未要求顯示 Orders 或在計算中使用其數據,則沒有理由使用系統內存或計算周期來創建它。通過使用 Lazy<Orders> 將 Orders 對象聲明為延遲初始化 (Lazy Initialization),可以避免在不使用該對象的情況下浪費系統資源。有一個對象的創建開銷很大,您想要將創建它的時間延遲到完成其他開銷大的操作之后。例如,假定您的程序在啟動時加載若干個對象實例,但只有一些對象實例需要立即執行。通過將不必要的對象的初始化延遲到已創建必要的對象之后,可以提高程序的啟動性能。