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

C#實(shí)現(xiàn)單例模式的多種方式

 更新時(shí)間:2022年01月25日 10:09:28   作者:痕跡g  
這篇文章介紹了C#實(shí)現(xiàn)單例模式的多種方式,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

什么是單例模式?

這里我就不做過多的解釋了, 畢竟關(guān)于Singleton的資料實(shí)在是太多太多了。點(diǎn)擊這里

簡單的思路就是, 創(chuàng)建對(duì)象單例的動(dòng)作轉(zhuǎn)移到另外的行為上面, 利用一個(gè)行為去創(chuàng)建對(duì)象自身, 如下:

public class Singleton
    {
       private Sington() { }
        private static Singleton _Singleton = null;
        public static Singleton CreateInstance()
        {
            if (_Singleton == null)
            {
             Console.WriteLine("被創(chuàng)建");
             _Singleton = new Singleton();
            }
            return _Singleton;
        }
    }

這樣寫看上去是沒有問題, 但是有沒有那種可能, 同時(shí)兩個(gè)動(dòng)作都判斷這個(gè)對(duì)象為空, 那么這個(gè)對(duì)象就會(huì)被創(chuàng)建2次?是的, 多線程中, 這樣是無法保證單例。

就像這樣, 同時(shí)創(chuàng)建多個(gè)線程去創(chuàng)建這個(gè)對(duì)象實(shí)例的時(shí)候, 會(huì)被多次創(chuàng)建, 這個(gè)時(shí)候, 對(duì)代碼改進(jìn)一下。

public class Singleton
    {
       private Sington() { }
        private static Singleton _Singleton = null;
        private static object Singleton_Lock = new object(); //鎖同步
        public static Singleton CreateInstance()
        {
                lock (Singleton_Lock)
                {
            Console.WriteLine("路過");
                    if (_Singleton == null)
                    {
              Console.WriteLine("被創(chuàng)建");
                        _Singleton = new Singleton();
                    }
                }
            return _Singleton;
        }
    }

調(diào)試代碼:

                TaskFactory taskFactory = new TaskFactory();
                List<Task> taskList = new List<Task>();

                for (int i = 0; i < 5; i++)
                {
                    taskList.Add(taskFactory.StartNew(() =>
                     {
                         Singleton singleton = Singleton.CreateInstance(); 
                     }));
                }

結(jié)果:

上面, 我們創(chuàng)建了多個(gè)線程,同時(shí)去創(chuàng)建這個(gè)對(duì)象的實(shí)例, 在第二次,對(duì)象命名已經(jīng)被創(chuàng)建了, 盡管只創(chuàng)建了一次滿足了我們的需求, 但是我們已知對(duì)象被創(chuàng)建了, 還需要進(jìn)來做不必要的動(dòng)作嗎?

我們都知道, 同步鎖為了達(dá)到預(yù)期的效果, 也是損耗了性能的, 那么下面的輸出, 很顯然是沒必要的動(dòng)作, 所以我們優(yōu)化一下。

    public class Singleton
    {
        private static Singleton _Singleton = null;
        private static object Singleton_Lock = new object();
        public static Singleton CreateInstance()
        {
            if (_Singleton == null) //雙if +lock
            {
                lock (Singleton_Lock)
                {
                    Console.WriteLine("路過。");
                    if (_Singleton == null)
                    {
                        Console.WriteLine("被創(chuàng)建。");
                        _Singleton = new Singleton();
                    }
                }
            }
            return _Singleton;
        }
    }

結(jié)果:

很顯然, 這樣達(dá)到了我們的預(yù)期, 對(duì)象在被創(chuàng)建后, 就沒必要做多余的行為。

利用靜態(tài)變量實(shí)現(xiàn)單例模式

 public sealed class Singleton
    {
        private Singleton() { }

        private static readonly Singleton singleInstance = new Singleton();

        public static Singleton GetInstance
        {
            get
            {
                return singleInstance;
            }
        }
    }

是不是覺得很優(yōu)雅, 利用靜態(tài)變量去實(shí)現(xiàn)單例, 由CLR保證,在程序第一次使用該類之前被調(diào)用,而且只調(diào)用一次

PS: 但是他的缺點(diǎn)也很明顯, 在程序初始化后, 靜態(tài)對(duì)象就被CLR構(gòu)造了, 哪怕你沒用。

利用靜態(tài)構(gòu)造函數(shù)實(shí)現(xiàn)單例模式

 public class SingletonSecond
    {
        private static SingletonSecond _SingletonSecond = null;

        static SingletonSecond()
        {
            
            _SingletonSecond = new SingletonSecond();
        }
        
        public static SingletonSecond CreateInstance()
        {
            return _SingletonSecond;
        }
    }

靜態(tài)構(gòu)造函數(shù):只能有一個(gè),無參數(shù)的,程序無法調(diào)用 。

同樣是由CLR保證,在程序第一次使用該類之前被調(diào)用,而且只調(diào)用一次。同靜態(tài)變量一樣, 它會(huì)隨著程序運(yùn)行, 就被實(shí)例化, 同靜態(tài)變量一個(gè)道理。

單例模式中的延遲加載

延遲加載或延遲加載是一種設(shè)計(jì)模式,或者您可以說這是一個(gè)概念,通常用于將對(duì)象的初始化延遲到需要時(shí)。因此,延遲加載的主要目標(biāo)是按需加載對(duì)象,或者您可以根據(jù)需要說出對(duì)象。

作為 .NET Framework 4.0 的一部分引入的惰性關(guān)鍵字為惰性初始化(即按需對(duì)象初始化)提供了內(nèi)置支持。如果要使對(duì)象(如 Singleton)以延遲初始化,則只需將對(duì)象的類型(單例)傳遞給lazy關(guān)鍵字,如下所示。

private static readonly Lazy<Singleton> Instancelock = new Lazy<Singleton>(() => new Singleton());
 public sealed class Singleton
     {
         private Singleton()
         {}
 
         private static readonly Lazy<Singleton> Instancelock =
                     new Lazy<Singleton>(() => new Singleton());
 
         public static Singleton GetInstance
         {
             get
             {
                 return Instancelock.Value;
             }
         }
     }

到此這篇關(guān)于C#實(shí)現(xiàn)單例模式的多種方式的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的方法分析

    C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的方法分析

    這篇文章主要介紹了C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的方法,結(jié)合實(shí)例形式分析了C#使用HttpWebRequest類與System.IO類實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-02-02
  • C#串口編程System.IO.Ports.SerialPort類

    C#串口編程System.IO.Ports.SerialPort類

    這篇文章介紹了C#串口編程System.IO.Ports.SerialPort類,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Json操作庫DynamicJson使用指南

    Json操作庫DynamicJson使用指南

    本文給大家分享的是專門為.NET程序員開發(fā)的Json操作庫DynamicJson,其源碼非常簡單,僅僅只有400行代碼,一個(gè)對(duì)應(yīng)的class類,目前只支持.NET 4.0以上的.NET Framework。
    2016-09-09
  • C#實(shí)現(xiàn)簡單超市收銀系統(tǒng)

    C#實(shí)現(xiàn)簡單超市收銀系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡單超市收銀系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C# foreach獲取循環(huán)索引的四種方法

    C# foreach獲取循環(huán)索引的四種方法

    在C#中使用foreach循環(huán)的時(shí)候我們有時(shí)會(huì)碰到需要索引的情況,在for循環(huán)中我們可以得到循環(huán)索引 , foreach并不直接提供 , 下面介紹4種foreach獲取索引的方法,希望對(duì)大家有用處,需要的朋友可以參考下
    2025-03-03
  • Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動(dòng)畫

    Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法

    C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法,主要涉及DataGrid控件的添加與使用、數(shù)據(jù)源的綁定、單元格與行的獲取等操作。需要的朋友可以參考下
    2014-09-09
  • 一篇文章看懂C#中的協(xié)變、逆變

    一篇文章看懂C#中的協(xié)變、逆變

    這篇文章主要給大家介紹了如何通過一篇文章看懂C#中協(xié)變、逆變的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • C#調(diào)用系統(tǒng)API指定快捷鍵的方法

    C#調(diào)用系統(tǒng)API指定快捷鍵的方法

    這篇文章主要介紹了C#調(diào)用系統(tǒng)API指定快捷鍵的方法,涉及C#快捷鍵的操作技巧,需要的朋友可以參考下
    2015-06-06
  • C#對(duì)集合進(jìn)行排序

    C#對(duì)集合進(jìn)行排序

    這篇文章介紹了C#對(duì)集合進(jìn)行排序的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評(píng)論

泸州市| 阜新市| 阿尔山市| 江川县| 威海市| 南阳市| 土默特右旗| 栾川县| 蕉岭县| 泽州县| 临湘市| 石城县| 镇康县| 镇远县| 岱山县| 潼南县| 榆树市| 荆门市| 武清区| 临沭县| 九台市| 江陵县| 天等县| 稷山县| 汶上县| 保康县| 武定县| 澎湖县| 隆安县| 密云县| 武陟县| 吴忠市| 泰和县| 赣州市| 虎林市| 邳州市| 安达市| 四平市| 江源县| 托克托县| 无棣县|