欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

單例類與靜態(tài)類在c#中的區(qū)別是什么-創(chuàng)新互聯(lián)

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

你所需要的網(wǎng)站建設(shè)服務(wù),我們均能行業(yè)靠前的水平為你提供.標(biāo)準(zhǔn)是產(chǎn)品質(zhì)量的保證,主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站建設(shè)、成都做手機(jī)網(wǎng)站、網(wǎng)頁設(shè)計(jì)、高端網(wǎng)站設(shè)計(jì)、網(wǎng)頁制作、做網(wǎng)站、建網(wǎng)站。創(chuàng)新互聯(lián)公司擁有實(shí)力堅(jiān)強(qiáng)的技術(shù)研發(fā)團(tuán)隊(duì)及素養(yǎng)的視覺設(shè)計(jì)專才。

1.設(shè)計(jì)模式:單例模式

單例模式:屬于設(shè)計(jì)模式中創(chuàng)建類型的模式,通過單例模式的方法創(chuàng)建的類,在當(dāng)前程序中只有一個實(shí)例,當(dāng)然可以實(shí)現(xiàn)為線程安全的單例。

這里簡單復(fù)習(xí)下創(chuàng)建代碼:

1.1 使用時分配,

使用時實(shí)例化,多線程應(yīng)用時,使用不當(dāng)會有線程安全問題。

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

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

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

1.2 聲明時實(shí)例化

聲明實(shí)例時實(shí)例化,多線程應(yīng)用時,使用不當(dāng)會有線程安全問題。

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

1.3 雙檢鎖

推薦這個,經(jīng)典的線程安全單例實(shí)現(xiàn)

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依賴注入時的實(shí)現(xiàn)

//FileLogger只需要定義成一般的類即可,無需按照單例模式進(jìn)行實(shí)現(xiàn),當(dāng)然也不能是靜態(tài)類。

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

2. 單例類和靜態(tài)類的比較

我們基于以下幾個要點(diǎn)進(jìn)行比較

  • 是否支持依賴注入

  • 內(nèi)存管理是怎樣的

  • 可擴(kuò)展性

  • 可測試性

靜態(tài)類形如:

public static class StaticExample
 {
  private static readonly object lockObj = new object();
  public static void Log(string message)
  {
   //Write code here to log data.
  }
 }
特性比較靜態(tài)類單例類
是否支持依賴注入否,編譯時提示靜態(tài)類型不能作為類型參數(shù)支持
內(nèi)存管理是怎樣的靜態(tài)類存儲在托管堆的high frequency heap,僅當(dāng)應(yīng)用程序卸載時,才釋放內(nèi)存單例類的單個實(shí)例是靜態(tài)的,因此也保存在high frequency heap,當(dāng)應(yīng)用程序卸載時,才釋放內(nèi)存。但是,與只能具有靜態(tài)對象的靜態(tài)類不同,單例類可以同時具有靜態(tài)和非靜態(tài)對象。因此,從內(nèi)存管理的角度來看,當(dāng)您使用單例類時,可以利用垃圾回收管理對象。
可擴(kuò)展性您不能繼承靜態(tài)類并覆蓋其方法 ;靜態(tài)類不能具有擴(kuò)展方法單例類通常包含一個私有構(gòu)造函數(shù),并標(biāo)記為已密封,以指示它既不能實(shí)例化也不能繼承;因此,只有在單例類中具有非私有構(gòu)造函數(shù)的情況下,才可以擴(kuò)展單例類;單例類可以具有擴(kuò)展方法
可測試性模擬靜態(tài)類非常困難,特別是在包含靜態(tài)對象的時候。當(dāng)然如果是只有靜態(tài)方法,且冪等則還是很容易測試的測試單例類很容易

看完上述內(nèi)容,你們掌握單例類與靜態(tài)類在c#中的區(qū)別是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

本文題目:單例類與靜態(tài)類在c#中的區(qū)別是什么-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://chinadenli.net/article12/djpdgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站維護(hù)外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、小程序開發(fā)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名