當(dāng)前位置:首頁(yè) > IT技術(shù) > Windows編程 > 正文

記《learning hard C#學(xué)習(xí)筆記》 書(shū)中一個(gè)錯(cuò)誤
2021-08-08 12:11:03

以前學(xué)過(guò)c# 但是不夠系統(tǒng)

最近讀了一本《learning hard C#學(xué)習(xí)筆記》 系統(tǒng)的學(xué)習(xí)一下

讀到50頁(yè) 發(fā)現(xiàn)一個(gè)問(wèn)題,這本書(shū)用的單例有問(wèn)題?記《learning hard C#學(xué)習(xí)筆記》 書(shū)中一個(gè)錯(cuò)誤_構(gòu)造方法

?

主要問(wèn)題:

1 首先public static Person person 這里的public 就有問(wèn)題 ?單例里面 這里應(yīng)該是private

2 在GetInstance方法里面 ?person = new Person() 這句不對(duì)

這樣每次調(diào)用GetInstance方法都會(huì)new一個(gè)Person對(duì)象出來(lái)

就不是單例

線(xiàn)程完全問(wèn)題等暫且不談。

?

兩次通過(guò)GetInstance()方法獲取 Person實(shí)例。

發(fā)現(xiàn) 私有構(gòu)造器方法被調(diào)用兩次且

用==去判斷發(fā)現(xiàn),兩次獲取的Person實(shí)例并不相同。

因此不是單例。

?

記《learning hard C#學(xué)習(xí)筆記》 書(shū)中一個(gè)錯(cuò)誤_構(gòu)造方法_02

對(duì)Person類(lèi)作如下改動(dòng):

?

    class Person
    {

        private string name;
        private static Person person;
        public string Name
        {
            get { return name; }
        }

        private Person()
        {
            Console.WriteLine("私有構(gòu)造方法被調(diào)用");
            this.name = "learning hard";
        }

        public static Person getInstance()
        {
            if (person == null)
            {
                person = new Person();
            }
            return person;
        }

    }


運(yùn)行:

?

?

    class Program
    {
        static void Main(string[] args)
        {
            Person person1 = Person.getInstance();
            Person person2 = Person.getInstance();

            Console.WriteLine("單例是否有效:{0}", person1 == person2);
            Console.WriteLine("類(lèi)實(shí)例的name屬性為:{0}",person1.Name);
            Console.Read();
        }
    }

?

?

?

運(yùn)行結(jié)果:
記《learning hard C#學(xué)習(xí)筆記》 書(shū)中一個(gè)錯(cuò)誤_c#_03

?

其次?個(gè)人建議方法名用小駝峰命名法

獲取實(shí)例的方法名用getInstance比較合適

?

本文摘自 :https://blog.51cto.com/u

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >