以前學(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)題?
?
主要問(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)
就不是單例
線程完全問(wèn)題等暫且不談。
?
兩次通過(guò)GetInstance()方法獲取 Person實(shí)例。
發(fā)現(xiàn) 私有構(gòu)造器方法被調(diào)用兩次且
用==去判斷發(fā)現(xiàn),兩次獲取的Person實(shí)例并不相同。
因此不是單例。
?
對(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é)果:
?
其次?個(gè)人建議方法名用小駝峰命名法
獲取實(shí)例的方法名用getInstance比較合適
?
本文摘自 :https://blog.51cto.com/u