當我們在進行 .NET 專案設計的時候,若在程式啟動的時候,設計了許多物件,此時會造成需要建立這些物件與進行初始化的工作,最後,就有可能表顯出這個應用程式啟動速度很慢;當然,還有很多情境,我們並不期望在我們宣告物件的時候,就進行物件的實例化(例如,該類別會耗用滿多的記憶體空間等等)。此時,我們可以使用 .NET 提供的 物件延遲產生 Lazy Initialization 技術。
在這個練習中,我們宣告了底下的類別,為了要能夠知道有執行個體產生出來,所以,我們在建構函式內,輸出訊息,讓我們知道這個類別的物件已經生成了。
另外,在這個類別中,我們建立了兩個建構函式,一個為預設建構函式,另外一個建構函式會接受兩個參數,不過在這個有接受參數的建構函式宣告中,我們又使用了
this()
來間接呼叫另外一個建構函式。 public class MyClass
{
public string Name { get; set; }
public int Value { get; set; }
public MyClass()
{
Console.WriteLine("MyClass 執行個體已經生成了");
}
public MyClass(string name, int value):this()
{
Name = name;
value = Value;
}
}
進行測試
接著,我們開始進行測試,首先我們執行底下程式碼。
在這裡,我們僅宣告與定義
Lazy<MyClass>
類別物件,這表示我們產生了一個物件延遲生成物件,而在泛型內所標示的型別,就是我們實際要使用型別物件;當底下程式碼執行之後,我們可以從控制台輸出畫面中,看到這個 MyClass 物件並沒有真的實例化一個執行個體。 Console.WriteLine("宣告 物件延遲產生 物件變數");
// // 這裡使用了 具名引數
Lazy<MyClass> myClass = new Lazy<MyClass>(()=>new MyClass(value:100, name: "這是物件延遲產生"));
Console.WriteLine("Press any key for continuing...");
Console.ReadKey();
接著,我們透過剛剛產生的
Lazy<MyClass>
類別物件,取得我們實際需要的執行個體 myClass.Value
,一旦我們有存取這個屬性, MyClass 類別就會立即產生這個物件;我們可以從輸出訊息中,看到這個類別的建構函式確實有執行到。 Console.WriteLine($"延遲物件的屬性值 Name={myClass.Value.Name} / Value={myClass.Value.Value}");
Console.WriteLine("Press any key for continuing...");
Console.ReadKey();
底下是執行結果的輸出內容
宣告 物件延遲產生 物件變數
Press any key for continuing...
MyClass 執行個體已經生成了
延遲物件的屬性值 Name=這是物件延遲產生 / Value=0
Press any key for continuing...