91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

單例類與靜態類在c#中的區別是什么

發布時間:2021-01-11 15:09:22 來源:億速云 閱讀:486 作者:Leah 欄目:開發技術

單例類與靜態類在c#中的區別是什么?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1.設計模式:單例模式

單例模式:屬于設計模式中創建類型的模式,通過單例模式的方法創建的類,在當前程序中只有一個實例,當然可以實現為線程安全的單例。

這里簡單復習下創建代碼:

1.1 使用時分配,

使用時實例化,多線程應用時,使用不當會有線程安全問題。

public class SingletonA
 {
  //私有成員,使用時分配內存
  private static SingletonA _instance = null;
  //私有構造,杜絕直接new類
  private SingletonA() { }

  //獲取實例
  public static SingletonA GetInstance ()
  { 

   if (_instance == null)
   {
    _instance = new SingletonA();
   }
   return _instance;
  }
 }

1.2 聲明時實例化

聲明實例時實例化,多線程應用時,使用不當會有線程安全問題。

 public class SingletonB
 {
  //私有靜態成員,聲明類實例時,分配
  private static readonly SingletonB _instance = new SingletonB();
  //私有構造,杜絕直接new類
  private SingletonB() { }
  public static SingletonB GetInstance()
  {   
   return _instance;
  }
 }

1.3 雙檢鎖

推薦這個,經典的線程安全單例實現

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;
  }
 }

1.4 .net 特性保證的線程安全

最精簡版

public sealed class SingletonC
 {
  private SingletonC() { }
  public static readonly SingletonC Instance = new SingletonC();
 }

1.5 使用DI依賴注入時的實現

//FileLogger只需要定義成一般的類即可,無需按照單例模式進行實現,當然也不能是靜態類。

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews();
  services.AddSingleton<ILogger, FileLogger>();
}

2. 單例類和靜態類的比較

我們基于以下幾個要點進行比較

  • 是否支持依賴注入

  • 內存管理是怎樣的

  • 可擴展性

  • 可測試性

靜態類形如:

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#中的區別是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉鱼县| 芜湖县| 武乡县| 金乡县| 绿春县| 元江| 本溪| 沙雅县| 大埔县| 明溪县| 新巴尔虎左旗| 松潘县| 焦作市| 乐清市| 岳池县| 青岛市| 延庆县| 台山市| 沁阳市| 汽车| 绍兴县| 社旗县| 江油市| 昭苏县| 安义县| 肃宁县| 霍山县| 新泰市| 乌兰察布市| 赣榆县| 开原市| 同仁县| 荆门市| 辽中县| 金昌市| 定边县| 南乐县| 南木林县| 祁东县| 大埔区| 韶关市|