C#泛型技巧:使用 C# 2.0 泛型來完成單例模式的重用

來源:互聯網
上載者:User
使用 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 提供的參數。這稱為裸類型約束。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.