最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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#中的協(xié)變與逆變

    圖文詳解C#中的協(xié)變與逆變

    “協(xié)變”是指能夠使用與原始指定的派生類型相比,派生程度更大的類型,“逆變”則是指能夠使用派生程度更小的類型,這篇文章主要給大家介紹了關(guān)于C#中協(xié)變與逆變的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • C#實(shí)現(xiàn)加密bat文件的示例詳解

    C#實(shí)現(xiàn)加密bat文件的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)加密bat文件的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • c#實(shí)現(xiàn)爬蟲程序

    c#實(shí)現(xiàn)爬蟲程序

    這篇文章介紹了c#實(shí)現(xiàn)爬蟲程序的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Unity中的靜態(tài)批處理和動(dòng)態(tài)批處理操作

    Unity中的靜態(tài)批處理和動(dòng)態(tài)批處理操作

    這篇文章主要介紹了Unity中的靜態(tài)批處理和動(dòng)態(tài)批處理操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#串口編程實(shí)例代碼

    C#串口編程實(shí)例代碼

    這篇文章主要為大家詳細(xì)介紹了C#串口編程實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • C#程序加密與解密的流程步驟

    C#程序加密與解密的流程步驟

    文章介紹了一種基于CPU和硬盤編碼的C#程序加密方法,包括生成、驗(yàn)證和保存注冊碼的過程,以及如何在用戶軟件和解密程序中實(shí)現(xiàn)這一功能,文中通過代碼示例和圖文講解的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • C#實(shí)現(xiàn)徹底刪除文件的方法

    C#實(shí)現(xiàn)徹底刪除文件的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)徹底刪除文件的方法,可實(shí)現(xiàn)類似360粉碎文件的效果,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-11-11
  • c#使用IAsyncEnumerable實(shí)現(xiàn)流式分段傳輸

    c#使用IAsyncEnumerable實(shí)現(xiàn)流式分段傳輸

    這篇文章主要為大家詳細(xì)介紹了c#如何使用IAsyncEnumerable實(shí)現(xiàn)流式分段傳輸,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • C# 讀取指定路徑配置文件的方法

    C# 讀取指定路徑配置文件的方法

    為了實(shí)現(xiàn)多個(gè)C#程序共用一個(gè)config文件,需要程序讀取指定路徑的config文件。代碼如下:
    2013-03-03
  • C# 開發(fā)step步驟條控件詳解

    C# 開發(fā)step步驟條控件詳解

    本篇文章主要介紹了用C#來實(shí)現(xiàn)一個(gè)step控件的方法步驟,具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03

最新評論

花莲县| 鹤壁市| 星座| 惠州市| 双峰县| 栾城县| 胶南市| 玉林市| 苍山县| 磴口县| 邵东县| 禄丰县| 金秀| 横山县| 崇左市| 德阳市| 白朗县| 汝州市| 年辖:市辖区| 鹤岗市| 东港市| 府谷县| 女性| 海丰县| 河北省| 河北区| 新巴尔虎右旗| 秦皇岛市| 崇州市| 桂阳县| 瑞安市| 溆浦县| 周口市| 巨野县| 英德市| 崇州市| 铁力市| 三亚市| 永顺县| 班戈县| 吉安县|