کلاس System.Lazy

احتمالا تا به حال این سوال در ذهن شما مطرح شده که آیا امکان دارد که ایجاد یک متغیر را تا زمانی که آن متغیر مورد استفاده قرار گیرد به تعویق اندازیم یا نه. این وضعیت در مواقعی نمود بیشتری پیدا میکند که متغیر یا فعالیت مرتبط با آن به نسبت سنگین باشد. در  .net۴  این امکان بوسیله کلاسی به نام lazy  در فضای نام System  ایجاد شده است. متغیری که با استفاده از کلاس مذکور اعلان و تعریف می شود هنگامی بوجود می آید (منظور از بوجود آمدن در این جا این است که به طور واقعی و به اندازه مورد نیاز فضای حافظه دریافت کند یا فعالیت مورد نظر همراه آن اجرا شود) که دسترسی که مقدار آن متغیر انجام شود (lazy<T>.Value ) یا متد Lazy<T>.ToString  از متغیر مربوطه فراخوانی شود.

مثال زیر نحوه استفاده از این کلاس را مشخص می نماید. برای درک بهتر این مثال نیاز است که مفاهیمی همچون delegate  و anonymous function  آشنایی داشته باشید.

Lazy<List<string>> processes =
            new Lazy<List<string>>(
                // دلگیت بی نامی که برای ایجاد کردن متغیر مورد نظر ما استفاده می شود.
            () =>
            {
                List<string> processNames = new List<string>();
                foreach (var p in Process.GetProcesses())
                {
                    processNames.Add(p.ProcessName);
                }
                // فرایند ایجاد متغیر مورد نظر ما باید با بازگرداندن این متغیر به متد ایجاد کننده کلاس lazy پایان یابد.
                return processNames;
            });

تکه کد بالا نحوه ایجاد کردن یک شی از کلاس Lazy  را نمایش میدهد. کلاس Lazy  به صورتی است که باید نوع متغیری را که نیاز به ایجاد دیر هنگام داریم را مشخص کنیم. در اینجا نوع ما لیستی از رشته ها است (List<string>) تابع ایجاد کننده ای که در اینجا استفاده کرده ایم، تابعی را (delegate  مربوط به آنرا) که متغیر مورد نظر ما را تولید می کند به عنوان پارامتر دریافت می کند. این تابع باید در نهایت متغیر مورد نظر ما را به عنوان خروجی بازگرداند.

تابع PrintSystemInfo  در این برنامه عمل استفاده از متغیر را به صورت ساده انجام می دهد.

این تابع پاراکتر ورودی هم نوع با متغیر تعریف شده ما با استفاده از کلاس Lazy  دریافت می کند (Lazy<List<string>> processNames ). عمل دسترسی به مقدار متغیر و در نتیجه ایجاد آن متغیر به صورت زیر انجام می گیرد.

 

...
foreach (string in processNames.Value)
...

در واقع در اولین دسترسی به این متغیر با استفاده از روش بالا متد مربوط به ایجاد آن متغیر اجرا شده و متغیر به صورت واقعی ایجاد می شود.


موفق و پیروز باشید...

فایل ضمیمه مقاله: ConsoleApplication۱.rar


نام نویسنده: فرید بکران |منبع:.NET Tips