国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#單例類的實現(xiàn)方法

2020-01-24 00:04:47
字體:
供稿:網(wǎng)友

單例類保證一個類全局僅有一個實例,并提供一個全局訪問點,由于只能生成一個實例,因此我們必須把構(gòu)造函數(shù)設(shè)為私有函數(shù)以禁止他人創(chuàng)建實例。

實現(xiàn)1:懶漢式,線程不安全

該實現(xiàn)沒有額外開銷,不要求線程安全的情況下可以使用:

public class Singleton1{  private static Singleton1 instance = null;  private Singleton1() { }  public static Singleton1 Instance  {    get    {      if (instance == null)      {        instance = new Singleton1();      }      return instance;    }  }}

實現(xiàn)2:懶漢式,線程安全

由于每次訪問單例類實例都會加鎖,而加鎖是一個非常耗時的操作,故不推薦使用:

public class Singleton2{  private readonly static object lockObj = new object();  private static Singleton2 instance = null;  private Singleton2() { }  public static Singleton2 Instance  {    get    {      lock(lockObj)      {        if (instance == null)        {          instance = new Singleton2();        }      }      return instance;    }  }}

實現(xiàn)3:餓漢式,線程安全

寫法簡單,線程安全,但構(gòu)造時機不是由程序員掌控的:

public class Singleton3{  private static Singleton3 instance = new Singleton3();  private Singleton3() { }  public static Singleton3 Instance { get { return instance; } }  public static void Test()  {    Console.WriteLine("test");  }}

當(dāng).NET運行時發(fā)現(xiàn)第一次使用Singleton3時會創(chuàng)建單例的實例,而不是在第一次調(diào)用Singleton3.Instance屬性時創(chuàng)建,如進行以下操作:

Singleton3.Test();

實現(xiàn)4:懶漢式,雙重校驗鎖

在實現(xiàn)2的基礎(chǔ)上進行改進,只在第一次創(chuàng)建實例時加鎖,提高訪問性能:

public class Singleton4{  private readonly static object lockObj = new object();  private static Singleton4 instance = null;  private Singleton4() { }  public static Singleton4 Instance  {    get    {      if (instance == null)      {        lock (lockObj)        {          if (instance == null)          {            instance = new Singleton4();          }        }      }      return instance;    }  }}

實現(xiàn)5:懶漢式,內(nèi)部類

在方法3的基礎(chǔ)上進行改進,確保只有訪問Singleton5.Instance屬性時才會構(gòu)造實例:

public class Singleton5{  class Nested   {    internal static readonly Singleton5 instance = new Singleton5();  }  private Singleton5() { }  public static Singleton5 Instance { get { return Nested.instance; } }}

實現(xiàn)單例基類

通過單例基類,我們可以簡單的通過繼承創(chuàng)建一個單例類,實現(xiàn)代碼復(fù)用:

// 由于單例基類不能實例化,故設(shè)計為抽象類public abstract class Singleton<T> where T : class{  // 這里采用實現(xiàn)5的方案,實際可采用上述任意一種方案  class Nested  {    // 創(chuàng)建模板類實例,參數(shù)2設(shè)為true表示支持私有構(gòu)造函數(shù)    internal static readonly T instance = Activator.CreateInstance(typeof(T), true) as T;  }  private static T instance = null;  public static T Instance { get { return Nested.instance; } }}

使用方法如下:

class TestSingleton : Singleton<TestSingleton>{  // 將構(gòu)造函數(shù)私有化,防止外部通過new創(chuàng)建  private TestSingleton() { }}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 南宁市| 宝山区| 郧西县| 定陶县| 平乡县| 比如县| 博湖县| 原阳县| 肥西县| 蓬安县| 蕉岭县| 墨玉县| 来凤县| 运城市| 交城县| 曲水县| 石阡县| 抚宁县| 屏东县| 济阳县| 葵青区| 安泽县| 鄂尔多斯市| 七台河市| 迭部县| 河源市| 万年县| 安国市| 临沭县| 葫芦岛市| 开远市| 凤翔县| 莱芜市| 竹北市| 慈利县| 汪清县| 白沙| 正阳县| 华坪县| 清丰县| 贵州省|