您好,登錄后才能下訂單哦!
單例類與靜態類在c#中的區別是什么?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
單例模式:屬于設計模式中創建類型的模式,通過單例模式的方法創建的類,在當前程序中只有一個實例,當然可以實現為線程安全的單例。
這里簡單復習下創建代碼:
使用時實例化,多線程應用時,使用不當會有線程安全問題。
public class SingletonA { //私有成員,使用時分配內存 private static SingletonA _instance = null; //私有構造,杜絕直接new類 private SingletonA() { } //獲取實例 public static SingletonA GetInstance () { if (_instance == null) { _instance = new SingletonA(); } return _instance; } }
聲明實例時實例化,多線程應用時,使用不當會有線程安全問題。
public class SingletonB { //私有靜態成員,聲明類實例時,分配 private static readonly SingletonB _instance = new SingletonB(); //私有構造,杜絕直接new類 private SingletonB() { } public static SingletonB GetInstance() { return _instance; } }
推薦這個,經典的線程安全單例實現
public class SingletonD { private static SingletonD _instance = null; private static readonly object _lockObject = new object(); private SingletonD() { } public static SingletonD GetInstance() { if (_instance == null) { lock (_lockObject) { if (_instance == null) _instance = new SingletonD(); } } return _instance; } }
最精簡版
public sealed class SingletonC { private SingletonC() { } public static readonly SingletonC Instance = new SingletonC(); }
//FileLogger只需要定義成一般的類即可,無需按照單例模式進行實現,當然也不能是靜態類。 public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddSingleton<ILogger, FileLogger>(); }
我們基于以下幾個要點進行比較
是否支持依賴注入
內存管理是怎樣的
可擴展性
可測試性
靜態類形如:
public static class StaticExample { private static readonly object lockObj = new object(); public static void Log(string message) { //Write code here to log data. } }
特性比較 | 靜態類 | 單例類 |
---|---|---|
是否支持依賴注入 | 否,編譯時提示靜態類型不能作為類型參數 | 支持 |
內存管理是怎樣的 | 靜態類存儲在托管堆的high frequency heap,僅當應用程序卸載時,才釋放內存 | 單例類的單個實例是靜態的,因此也保存在high frequency heap,當應用程序卸載時,才釋放內存。但是,與只能具有靜態對象的靜態類不同,單例類可以同時具有靜態和非靜態對象。因此,從內存管理的角度來看,當您使用單例類時,可以利用垃圾回收管理對象。 |
可擴展性 | 您不能繼承靜態類并覆蓋其方法 ;靜態類不能具有擴展方法 | 單例類通常包含一個私有構造函數,并標記為已密封,以指示它既不能實例化也不能繼承;因此,只有在單例類中具有非私有構造函數的情況下,才可以擴展單例類;單例類可以具有擴展方法 |
可測試性 | 模擬靜態類非常困難,特別是在包含靜態對象的時候。當然如果是只有靜態方法,且冪等則還是很容易測試的 | 測試單例類很容易 |
看完上述內容,你們掌握單例類與靜態類在c#中的區別是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。