基礎(chǔ)才是重中之重~LazyInitializer.EnsureInitialized對屬性實現(xiàn)化的性能優(yōu)化
LazyInitializer.EnsureInitialized是frameworks4.0引入的新東西,實現(xiàn)對屬性延時初始化的功能,它作用在System.Threading命名空間下,所以,它與多線程有著密切的關(guān)系,即當(dāng)多人同步使用這個方法時,對存儲的對象有著某種作用,這是msdn的相關(guān)說明:
這個方法可以用于多個執(zhí)行者初始化Target目錄對象。
在多個執(zhí)行者同時存取這個方法的情況下,可能會建立多個T執(zhí)行個體,但只有一個執(zhí)行個體會存儲至target。在些類情況下,這個方法將不會放置未儲存的對象。如果這類對象必須被放置,則由呼叫端判斷未使的對象,然后再對物件進(jìn)行適當(dāng)?shù)姆胖谩?/p>
對于概念不清楚的同步,沒有關(guān)系,看下面的例子如完全明白了,呵呵
下面的實例介紹了對屬性的兩個初始化,并進(jìn)行比較,延時初始化的好處,即在對象使用時再去初始化它,當(dāng)一個方法體中,如果一個對象初始化了一次,不要再進(jìn)行重復(fù)的初始化工作。
代碼1,展現(xiàn)了性能不好的情況
代碼2,展現(xiàn)了優(yōu)化的情況
代碼3,微軟為了我們進(jìn)行了封裝,在多線程中表現(xiàn)更好
代碼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> /// 延時初始化指定屬性 /// </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); } }
而它們運行的結(jié)果,我們可想而知了,當(dāng)一個類中多次使用同一個對象時,性能不好的,返回的Name(當(dāng)前時間),肯定是不同的,而性能好的,只初始化一次的,返回的Name(當(dāng)前時間)肯定是一個值,呵呵。
感謝閱讀!
浙公網(wǎng)安備 33010602011771號