真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

在C#中創(chuàng)建單例的方法有哪些-創(chuàng)新互聯(lián)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)在C#中創(chuàng)建單例的方法有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

綿竹ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!

第一種常見(jiàn)的方式創(chuàng)建單例:


/// 
 /// 不安全的單例
 /// 
 public sealed class Singleton
 {
  private static Singleton _Singleton;
  private Singleton() { }
  public static Singleton GetSingleton()
  {
   if (_Singleton == null)
   {
    _Singleton = new Singleton();
   }
   return _Singleton;
  }
 }

注:為什么說(shuō)是不安全的單例,多線程訪問(wèn)時(shí)可能會(huì)new多個(gè)對(duì)象...

第二種方式創(chuàng)建單例:

/// 
 /// (多線程)安全單例
 /// 
 public sealed class Singleton
 {
  private static Singleton _Singleton;
  private static readonly object obj = new object();
  private Singleton() { }
  public static Singleton GetSingleton()
  {
   if (_Singleton == null)
   {
    //加鎖保護(hù),在多線程下可以確保實(shí)例值被創(chuàng)建一次。缺點(diǎn)是每 次獲取單例,都要進(jìn)行判斷,涉及到的鎖和解鎖比較耗資源。
    lock (obj)
    {
     if (_Singleton == null)
     {
      _Singleton = new Singleton();
     }
    }

   }
   return _Singleton;
  }
 }

注:為了解決上面第一種方式創(chuàng)建的不安全實(shí)例問(wèn)題應(yīng)用而生。

第三種方式創(chuàng)建單例:

/// 
 /// 只讀單例
 /// 
 public sealed class Singleton
 {
  private static readonly Singleton instance = new Singleton();
  private Singleton() { }
  public static Singleton Instance
  {
   get
   {
    return instance;
   }
  }
 }
/// 
 /// 基于上面的只讀單例=自動(dòng)屬性只讀單例(語(yǔ)法糖)
 /// 
 public sealed class Singleton
 {
  private Singleton() { }
  public static Singleton Instance { get; } = new Singleton();
 }

注:只讀屬性式=>借助readonly屬性,instance只被初始化一次,同樣達(dá)到了單例的效果。在引用函數(shù)執(zhí)行第一句話之前,instance其實(shí)已經(jīng)被賦值了,并不是預(yù)期的 只有到訪問(wèn)Instance變量時(shí)才創(chuàng)建對(duì)象。

第四種方式創(chuàng)建單例:

/// 
 /// Singleton中加上靜態(tài)構(gòu)造函數(shù)。
 /// 
 public sealed class Singleton
 {
  public static readonly Singleton instance = new Singleton();
  private Singleton()
  {
   Console.WriteLine("初始化1!");
  }
  static Singleton()
  {
  }
  public static Singleton Instance
  {
   get { return instance; }
  }
 }

注:為了解決(第三種只讀屬性實(shí)例)在執(zhí)行第一句代碼之前,實(shí)例已經(jīng)被初始化問(wèn)題。

第五種方式創(chuàng)建單例:

/// 
 /// 使用Lazy創(chuàng)建單例,默認(rèn)是線程安全的
 /// 
 public sealed class Singleton
 {
  private static readonly Lazy instance = new Lazy(() => new Singleton());//
  private Singleton() { }
  public static Singleton Instance
  {
   get
   {
    return instance.Value;
   }
  }
 }
// 貼一下關(guān)于上面Lazy s=new Lazy()參數(shù)的定義;
  // 摘要:
  // 初始化System.Lazy`1類的新實(shí)例。 懶惰初始化時(shí)
   // 發(fā)生時(shí),使用指定的初始化函數(shù)和初始化模式。
  
  // 參數(shù):
  // valueFactory:
  // 被調(diào)用以生成延遲初始化值的委托是必需的參數(shù)
  //
  // isThreadSafe:
  //  如果要使此實(shí)例可由多個(gè)線程同時(shí)使用,則為true; false
         //使此實(shí)例一次只能由一個(gè)線程使用。
  public Lazy(Func valueFactory, bool isThreadSafe);

上述就是小編為大家分享的在C#中創(chuàng)建單例的方法有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


新聞標(biāo)題:在C#中創(chuàng)建單例的方法有哪些-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://weahome.cn/article/dopoph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部