כיצד לבצע אתחול עצל ב- C #

אתחול עצלן הוא טכניקה שמגדירה את יצירת האובייקט עד לפעם הראשונה שהוא נחוץ. במילים אחרות, אתחול של האובייקט קורה רק על פי דרישה. שים לב שהמונחים אתחול עצל ומיישר עצלן פירושו אותו דבר - ניתן להשתמש בהם לסירוגין. על ידי ניצול אתחול עצל, תוכלו לשפר את ביצועי היישום על ידי הימנעות מחישוב מיותרים וצריכת זיכרון. במאמר זה נבחן כיצד אנו יכולים לבצע אתחול עצלן ב- C #.

בואו נבין טעינה עצלה עם דוגמה פשוטה. שקול שני שיעורים, Customerו Order. Customerבכיתה מכילה Ordersנכס בתורו מפנה אוסף של מקרים של Orderהכיתה. Ordersאוסף עלולים להכיל כמות גדולה של נתונים ואף ייתכן שתצטרך חיבור הנתונים כדי להתחבר למסד הנתונים ולאחזר רשומות. במקרה כזה, אין טעם לטעון נתונים Ordersבנכס עד שנזדקק לנתונים. אתחול עצלן מאפשר לנו לטעון את Ordersהאוסף רק כאשר מבקשים את הנתונים.

שימוש בשיעור Lazy ב- C #

למרות שאתה יכול לכתוב קוד מותאם אישית משלך ליישום אתחול עצל, מיקרוסופט ממליצה להשתמש Lazyבכיתה במקום. Lazyהייצוגי Systemהמרחב ב- C # הוצג כחלק .Net Framework 4.0 כדי לספק דרך חוט בטוח ליישם אתחול עצלן. באפשרותך לנצל מחלקה זו כדי לדחות את אתחול האובייקטים עתירי המשאבים ביישום שלך.

כאשר אתה משתמש Lazyבכיתה, עליך לציין את סוג האובייקט שאתה מתכוון ליצור בעצלתיים בארגומנט הסוג. שים לב כי אתחול עצלן מתרחש כשאתה ניגש Lazy.Valueלמאפיין. הנה דוגמה כיצד Lazyניתן להשתמש בכיתה:

עָצֵל
   
     הזמנות = Lazy חדש
    
     ();
     

IEnumberable result = lazyOrders.Value;

עכשיו שקול שני שיעורים, Authorו Blog. מחבר יכול לכתוב פוסטים רבים בבלוג, כך שיש לך קשר של אחד לרבים בין הכיתות Authorלבין Blogהכיתות כפי שמוצג בקטע הקוד שלמטה.

מחלקה ציבורית מחבר

    {

        ID מזהה ציבורי {get; מַעֲרֶכֶת; }

        מחרוזת ציבורית FirstName {get; מַעֲרֶכֶת; }

        מחרוזת ציבורית LastName {get; מַעֲרֶכֶת; }

        כתובת מחרוזת ציבורית {get; מַעֲרֶכֶת; }

        בלוגים רשימת ציבוריים {get; מַעֲרֶכֶת; }

    }

    בלוג בכיתה ציבורית

    {

        ID מזהה ציבורי {get; מַעֲרֶכֶת; }

        מחרוזת ציבורית כותרת {get; מַעֲרֶכֶת; }

        Public DateTime PublicationDate {get; מַעֲרֶכֶת; }

    }

הערה שהקשר אחד-לרבים בין Authorלבין Blogכיתות כבר מיוצג באמצעות Listרכוש (מסוג Blog) ב Authorבכיתה. באמצעות מאפיין זה, Authorהמחלקה יכולה להחזיק אוסף של מופע אחד או יותר של Blogהכיתה.

עכשיו נניח שעלינו להציג רק את פרטי המחבר (שם פרטי, שם משפחה וכתובת) בממשק המשתמש. אין טעם לטעון את פרטי הבלוג עבור הכותב במקרה זה; אנחנו רוצים לטעון את פרטי הבלוג בעצלתיים. הנה Authorהמחלקה המעודכנת העונה לצורך זה. שימו לב לשימוש Lazyבשיעור.

מחלקה ציבורית מחבר

    {

        ID מזהה ציבורי {get; מַעֲרֶכֶת; }

        מחרוזת ציבורית FirstName {get; מַעֲרֶכֶת; }

        מחרוזת ציבורית LastName {get; מַעֲרֶכֶת; }

        כתובת מחרוזת ציבורית {get; מַעֲרֶכֶת; }

        ציבור עצלן בלוגים => Lazy חדש (() => GetBlogDetailsForAuthor (this.Id));

        פרטי IList GetBlogDetailsForAuthor (מזהה int)

        {

       // כתוב כאן קוד כדי לאחזר את כל פרטי הבלוג למחבר.

        }

    }

שימוש בשיעור הגנרי של Lazy ב- C #

בואו נסתכל כעת כיצד נוכל לנצל Lazyשיעור גנרי ליישום דפוס העיצוב של סינגלטון. (אתה יכול לקרוא את המאמר שלי על דפוס העיצוב של סינגלטון כאן.) הגרסה הבאה של StateManagerהכיתה היא בטוחה בחוטים. יחד עם זאת, זה מדגים אתחול עצל. שים לב כי נעשה שימוש בבנאי הסטטי המפורש כדי להבטיח שמהדר ה- C # לא מסמן את הסוג כ- beforefieldinit.

מעמד אטום ציבורי StateManager

    {

        StateManager פרטי ()

        {

        }

        מופע סטטי ציבורי של StateManager

        {

            לקבל

            {

                להחזיר Nested.obj;

            }

        }

        כיתה פרטית מקוננת

        {

            סטטי מקונן ()

            {

            }

            סטטי-פנימי קריא בלבד StateManager obj = StateManager חדש ();

        }

    }

הנה יישום עצלן של StateManagerהכיתה הממנפת את Lazyהכיתה. אתה יכול לראות איך Lazyהשיעור הופך את זה לממש פשוט ליישום עצלות. 

מעמד ציבורי StateManager

    {

        סטטי פרטי באופן קריא בלבד Lazy obj = new Lazy (() => StateManager חדש ());

        StateManager פרטי () {}

        מופע סטטי ציבורי של StateManager

        {

            לקבל

            {

                החזרת אובייקט. ערך;

            }

        }

    }

התבונן Instanceבנכס StateManagerבכיתה לעיל. שים לב Valueשהנכס שאתה רואה בדוגמת הקוד שלעיל הוא לקריאה בלבד. מסיבה זו אין אביזר מוגדר.

אתחול עצלן הוא טכניקת אופטימיזציה לביצועים מצוינת, המאפשרת לדחות את אתחול האובייקטים שצורכים משאבי CPU וזיכרון משמעותיים עד שתזדקק להם לחלוטין. נצל אתחול עצלן כדי לשפר את ביצועי האפליקציות שלך.