להשתמש במחלקה קיימת כדי לאתחל משתנה אשר צריך Thread safety (נדבר על זה עוד מעט).
לאתחל משתנה גלובלי סטטי - בגלל היכולת שלו להיות Thread safe.
כשמשאב הוא יקר והשימוש בו לא רב
כשהמשאב הוא יקר וצריך לבצע פעולה כלשהי כדי לאתחל אותו (כמו לקרוא מקובץ).
כיצד ליצור את המחלקה
מחלקת Lazy יכולה להיות מאותחלת במגוון דרכים:
Lazy - בנאי ריק
הבנאי הריק יוצר משתנה אשר יש לו בנאי ריק.
1 2 3 4 5 6
classMyClass { publicstring Name { get;set;} } Lazy<MyClass> lazyClass = new Lazy<MyClass>(); var myClassInstance = lazyClass.Value;
Lazy<T>(bool isThreadSafe) - עם סנכרון
ניתן להעביר בוליאני שאומר אם אנחנו רוצים שה-Lazy יהיה בעל הגנה לתהליכונים מרובים או לא. המחיר? משתנים שהם Thread-Safe סובלים מבעיות ביצועים.
1 2 3 4 5 6 7 8 9 10 11 12
classMyClass { publicstring Name { get;set;} } Lazy<MyClass> lazyClass = new Lazy<MyClass>(true);
for(int i=0;i<10;i++) { Task.Run(()=>{ var myClassInstance = lazyClass.Value; }); }
Lazy<T>(LazyThreadSafetyMode) - סוג סנכרון
ניתן לקנפג את ההתנהגות בהתאם למצב שאנו רוצים.
LazyThreadSafetyMode.None
אין Thread safety בכלל. מצב זה גורם לריבוי תהליכונים להיות - Undefined. לכן אם יש לכם יותר מתהליכון אחד אל תשתמשו בזה! אולם - זה מהיר יותר אז אם אתם יודעים שרק תהליכון אחד ישתמש ב-Lazy ניתן להשתמש ב-None.
LazyThreadSafetyMode.PublicationOnly
עבור תהליכונים רבים - הראשון שמשלים את תהליך האתחול הוא יסיים את התהליך.
היצירה וההשמה של המופע יהיה באופן מוגן ומלא כך שרק תהליכון אחד יוכל ליצור את המופע.
Lazy<T>(Func<T> function) - בניית המופע
הבנאי ייקבל מתודת Factory אשר יודעת כיצד ליצור משתנה. הבחירה הנכונה בבנאי זה כאשר אנו רוצים לבצע פעולה לפני יצירת המופע. זאת כדי להימנע מפעולות חיצוניות או מורכבות בתוך הבנאים.