מדי פעם אנחנו יוצרים Properties שהם Lazy – כלומר, הם לא מאותחלים עד הגישה הראשונה שלהם.
קיימות שתי דרכים נפוצות לעשות זאת:
עבור Reference types: השוואה לnull:
|
|
דרך שנייה להשגת מטרה זו היא באמצעות בוליאני המעיד האם הProperty כבר אותחל:
|
|
כך אנחנו מאתחלים את הProperty רק בגישה הראשונה אליו.
הבעיה עם השיטה השנייה היא שהיא יותר נכונה, אבל היא מאוד מכערת לנו את הקוד. זאת מאחר שלכל Property שהוא Lazy אנחנו צריכים להוסיף בוליאני, ובגישה לדאוג לאתחל אותו במידה ויש צורך.
בFramework 4.0 הוסיפו לנו טיפוס שמסייע לנו בפתרון בעיה זו, והוא Lazy<T>. איך זה עובד?
זהו טיפוס שמקבל delegate, שבאמצעותו אנחנו נאתחל אובייקט. בגישה הראשונה לProperty ששמו Value יתבצע הdelegate והאובייקט המאותחל ישמר. בשאר הגישות, נפנה לאובייקט שכבר אותחל.
כך נוכל להחליף את המימוש של הProperty בדרך הבאה: ניצור member בשם m_HeavyProperty מסוג Lazy<MyClass>. בConstructor נאתחל אותו:
|
|
בגישה לProperty פשוט ניגש לValue שלו:
|
|
וזהו!
שימו לב שהConstructor של Lazy<T> מקבל delegate, כך שנוכל להכניס lambda expression נחמד לפעמים לאתחול הProperty ולא סתם קריאה לפונקציה.
(הערה: יתרון נוסף של שימוש בLazy הוא התמיכה של המחלקה בנעילות המונעות אתחול של Member במספר Threadים במקביל. ראו גם טיפ מספר 283)
המשך יום טוב ועצלן