使用 C# 2.0 的泛型,使得實現我所說的"單例提供者"成為可能。這是一個可用來建立單例類執行個體確不需要為每個特定的類重寫單例模式代碼的可重用的類。這樣分離出單例結構的代碼,將有利於保持按單例模式使用類或不按單例模式使用類的靈活性。
/// <summary>
/// 單例提供者
/// </summary>
/// <typeparam name="T">需要的類</typeparam>
public class SingletonProvider<T> where T : new()
{
SingletonProvider() { }
public static T Instance
{
get { return SingletonCreator.instance; }
}
class SingletonCreator
{
static SingletonCreator() { }
internal static readonly T instance = new T();
}
}
關於where關鍵字(MSDN)
在定義泛型類時,可以對用戶端代碼能夠在執行個體化類時用於型別參數的類型種類施加限制。如果用戶端代碼嘗試使用某個約束所不允許的類型來執行個體化類,則會產生編譯時間錯誤。這些限制稱為約束。約束是使用 where 內容關鍵字指定的。下表列出了五種類型的約束:
約束 |
說明 |
T:結構 |
型別參數必須是實值型別。可以指定除 Nullable 以外的任何實值型別。 |
T:類 |
型別參數必須是參考型別,包括任何類、介面、委託或數群組類型。 |
T:new() |
型別參數必須具有無參數的公用建構函式。當與其他約束一起使用時,new() 約束必須最後指定。 |
T:<基類名> |
型別參數必須是指定的基類或派生自指定的基類。 |
T:<介面名稱> |
型別參數必須是指定的介面或實現指定的介面。可以指定多個介面約束。約束介面也可以是泛型的。 |
T:U |
為 T 提供的型別參數必須是為 U 提供的參數或派生自為 U 提供的參數。這稱為裸類型約束。 |