基(ji)礎才(cai)是重中之重~LazyInitializer.EnsureInitialized對屬性實現化的性能優(you)化
LazyInitializer.EnsureInitialized是frameworks4.0引(yin)入的(de)新東西,實現對屬(shu)性延時(shi)初始化的(de)功能,它作用在System.Threading命(ming)名空間(jian)下,所以(yi),它與多(duo)線程有著密切的(de)關(guan)(guan)系,即當多(duo)人(ren)同步使(shi)用這個方法時(shi),對存儲的(de)對象(xiang)有著某種(zhong)作用,這是msdn的(de)相關(guan)(guan)說明:
這(zhe)個方法可以用(yong)于多(duo)個執行者(zhe)初始化Target目錄對象(xiang)。
在多個(ge)執行者同時(shi)存(cun)取(qu)這個(ge)方法的情(qing)況下,可能會建立多個(ge)T執行個(ge)體,但只(zhi)有一個(ge)執行個(ge)體會存(cun)儲至target。在些類(lei)情(qing)況下,這個(ge)方法將不會放(fang)置(zhi)未(wei)儲存(cun)的對象。如(ru)果(guo)這類(lei)對象必須被放(fang)置(zhi),則由呼叫端判斷未(wei)使的對象,然(ran)后再對物(wu)件進行適當的放(fang)置(zhi)。
對于概(gai)念不(bu)清(qing)楚的(de)同(tong)步(bu),沒有關系,看(kan)下面的(de)例子如完全明白了,呵呵
下面的實例介紹了對屬性的兩個初始化,并進行比較,延時初始化的好處,即在對象使用時再去初始化它,當一個方法體中,如果一個對象初始化了一次,不要再進行重復的初始化工作。
代碼1,展現了性能不好的情況
代碼2,展現了優化的情況
代碼3,微軟為了我們進行了封裝,在多線程中表現更好
代碼1:
class TestLazyInitializer1 { public People People { get { return new People(); } } public void Print1() { Console.WriteLine(People.Name); } public void Print2() { Console.WriteLine(People.Name); } }
代碼2:
class TestLazyInitializer2 { People _people; public People People { get { return _people == null ? (_people = new People()) : _people; } } public void Print1() { Console.WriteLine(People.Name); } public void Print2() { Console.WriteLine(People.Name); } }
代碼3:
class TestLazyInitializer { private People _people; /// <summary> /// 延時(shi)初(chu)始化(hua)指(zhi)定屬性(xing) /// </summary> public People People { get { return LazyInitializer.EnsureInitialized( ref _people, () => { return new People(); }); } } public void Print1() { Console.WriteLine(People.Name); } public void Print2() { Console.WriteLine(People.Name); } }
而它們運行的結果,我們可想(xiang)而知(zhi)了,當一(yi)個(ge)類中多(duo)次使用(yong)同一(yi)個(ge)對象時(shi),性(xing)能不好(hao)的,返回的Name(當前時(shi)間),肯定是不同的,而性(xing)能好(hao)的,只初始(shi)化一(yi)次的,返回的Name(當前時(shi)間)肯定是一(yi)個(ge)值(zhi),呵呵。
感謝閱讀!