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

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

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

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

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

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

2、私有構造函數(無法實例化)

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

第一種常見的方式創(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;
  }
 }

注:為什么說是不安全的單例,多線程訪問時可能會new多個對象...

第二種方式創(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)
   {
    //加鎖保護,在多線程下可以確保實例值被創(chuàng)建一次。缺點是每 次獲取單例,都要進行判斷,涉及到的鎖和解鎖比較耗資源。
    lock (obj)
    {
     if (_Singleton == null)
     {
      _Singleton = new Singleton();
     }
    }

   }
   return _Singleton;
  }
 }

注:為了解決上面第一種方式創(chuà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>
 /// 基于上面的只讀單例=自動屬性只讀單例(語法糖)
 /// </summary>
 public sealed class Singleton
 {
  private Singleton() { }
  public static Singleton Instance { get; } = new Singleton();
 }

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

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

/// <summary>
 /// Singleton中加上靜態(tài)構造函數。
 /// </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; }
  }
 }

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

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

/// <summary>
 /// 使用Lazy創(chuàng)建單例,默認是線程安全的
 /// </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;
   }
  }
 }
// 貼一下關于上面Lazy<T> s=new Lazy<T>()參數的定義;
  // 摘要:
  // 初始化System.Lazy`1類的新實例。 懶惰初始化時
   // 發(fā)生時,使用指定的初始化函數和初始化模式。
  
  // 參數:
  // valueFactory:
  // 被調用以生成延遲初始化值的委托是必需的參數
  //
  // isThreadSafe:
  //  如果要使此實例可由多個線程同時使用,則為true; false
         //使此實例一次只能由一個線程使用。
  public Lazy(Func<T> valueFactory, bool isThreadSafe);

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

相關文章

  • 圖文詳解C#中的協變與逆變

    圖文詳解C#中的協變與逆變

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

    C#實現加密bat文件的示例詳解

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

    c#實現爬蟲程序

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

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

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

    C#串口編程實例代碼

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

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

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

    C#實現徹底刪除文件的方法

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

    c#使用IAsyncEnumerable實現流式分段傳輸

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

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

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

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

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

最新評論

石泉县| 梁平县| 泰和县| 伊宁县| 吉安县| 平遥县| 白山市| 新巴尔虎右旗| 集安市| 秦安县| 白玉县| 双辽市| 大丰市| 承德市| 班玛县| 高青县| 塘沽区| 同德县| 满洲里市| 承德县| 宝山区| 双牌县| 密云县| 英山县| 宜兰市| 张北县| 崇阳县| 嘉鱼县| 利川市| 两当县| 商水县| 拉孜县| 洪湖市| 霍山县| 临朐县| 松原市| 左贡县| 枣阳市| 静乐县| 西盟| 大足县|