欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 創(chuàng)建單例的多種方式

 更新時(shí)間:2021年03月12日 11:33:50   作者:realyrare  
這篇文章主要介紹了C# 創(chuàng)建單例的多種方式,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

關(guān)于為什么需要?jiǎng)?chuàng)建單例?這里不過多介紹,具體百度知。

  關(guān)于C#  創(chuàng)建單例步驟或條件吧

1、聲明靜態(tài)變量;

2、私有構(gòu)造函數(shù)(無法實(shí)例化)

3、靜態(tài)創(chuàng)建實(shí)例的方法;至于我這里的Singleton是sealed ,只是為了防止被繼承,其實(shí)有私有構(gòu)造函數(shù)足夠了,這里只是為了代碼可讀性。

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

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

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

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

/// <summary>
 /// (多線程)安全單例
 /// </summary>
 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í)例問題應(yīng)用而生。

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

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

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

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

/// <summary>
 /// Singleton中加上靜態(tài)構(gòu)造函數(shù)。
 /// </summary>
 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)被初始化問題。

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

/// <summary>
 /// 使用Lazy創(chuàng)建單例,默認(rèn)是線程安全的
 /// </summary>
 public sealed class Singleton
 {
  private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());//
  private Singleton() { }
  public static Singleton Instance
  {
   get
   {
    return instance.Value;
   }
  }
 }
// 貼一下關(guān)于上面Lazy<T> s=new Lazy<T>()參數(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<T> valueFactory, bool isThreadSafe);

以上就是C# 創(chuàng)建單例的多種方式的詳細(xì)內(nèi)容,更多關(guān)于c# 創(chuàng)建單例的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c#的異或運(yùn)算符介紹

    c#的異或運(yùn)算符介紹

    這篇文章介紹了c#的異或運(yùn)算符,有需要的朋友可以參考一下
    2013-11-11
  • C#中is與As運(yùn)算符號的使用詳解

    C#中is與As運(yùn)算符號的使用詳解

    本篇文章是對C#中is與As運(yùn)算符號的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C#深拷貝方法探究及性能比較(多種深拷貝)

    C#深拷貝方法探究及性能比較(多種深拷貝)

    這篇文章主要介紹了C#中使用NetCDF存儲二維數(shù)據(jù)的讀寫操作簡單應(yīng)用,探究了以下幾種C#對象深拷貝方式,同時(shí)簡單對比了以下列出的幾種深拷貝方式的速度,需要的朋友可以參考下
    2022-04-04
  • C# String字符串案例詳解

    C# String字符串案例詳解

    這篇文章主要介紹了C# String字符串案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Unity3D實(shí)現(xiàn)相機(jī)跟隨控制

    Unity3D實(shí)現(xiàn)相機(jī)跟隨控制

    這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)相機(jī)跟隨控制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C#如何快速釋放內(nèi)存的大數(shù)組詳解

    C#如何快速釋放內(nèi)存的大數(shù)組詳解

    這篇文章主要給大家介紹了關(guān)于C#如何快速釋放內(nèi)存的大數(shù)組的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C#實(shí)現(xiàn)平衡查找樹

    C#實(shí)現(xiàn)平衡查找樹

    本文詳細(xì)講解了C#實(shí)現(xiàn)平衡查找樹的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#形狀原點(diǎn)變換的方法

    C#形狀原點(diǎn)變換的方法

    這篇文章主要介紹了C#形狀原點(diǎn)變換的方法,涉及C#圖形繪制中原點(diǎn)變換的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • C#調(diào)用python腳本的方法詳解

    C#調(diào)用python腳本的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C#調(diào)用python腳本的方法,文中通過示例代碼介紹的非常詳細(xì),感興趣的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • C# Hook鉤子實(shí)例代碼 截取鍵盤輸入

    C# Hook鉤子實(shí)例代碼 截取鍵盤輸入

    C# Hook鉤子實(shí)例代碼之截取鍵盤輸入,需要的朋友可以參考下
    2013-05-05

最新評論