CSCIENCE

CSCIENCE

سیشارپ - باید دانست 6

دوشنبه, ۴ شهریور ۱۳۹۲، ۰۱:۳۵ ق.ظ
آزادسازی و مدیریت منابع (حافظه)

باید دانست که:
مدیریت فضاهای خالی و یا بلا استفاده حافظه در پروژه های بزرگ مسئله ی مهمی است. خوشبختانه سیشارپ با استفاده از Garbage Collector تا حد خیلی خوبی این عمل را انجام می دهد. به این صورت که به صورت موازی با برنامه ی شما اجرا می شود و هرگاه شئی پیدا کند که ارجاع به آن وجود ندارد و یا مطمئن باشد که دیگر به آن ارجاعی داده نمی شود، حافظه ی آن را آزاد می کند.
اما موازی اجرا شدن خود مسئله ی بزرگیست. این مسئله باعث می شود تا نتوان تشخیص داد چه موقع آزاد سازی صورت می گیرد. گاهی اوقات لازم است در یک زمان مشخص منبع آزاد شود. برای حل این مشکل لازم است از آزاد سازی دستی استفاده کنیم.
راه ساده برای این کار استفاده از Interfaceی به نام IDisposable می باشد. اکنون در کلاس شما باید متد Dispose به صورت مناسب در جهت آزاد سازی منابع مورد نظر پیاده سازی شود.

class MyClass IDisposable
{
        public void Dispose()
        {
            // Clean Up Here
        }
}

کافیست هرجا که لازم داشتید این متد را فراخوانی کنید.

این نکته از آن جهت اهمیت دارد که:
شاید این سوال را بپرسید که دلیل استفاده از IDisposable چیست و چرا یک متد به همین نام ننویسیم؟ کدی که در اینجا می بینید ظاهر کار است. سیشارپ در عمل از شئ دیگری استفاده می کند که از بوجود آمدن مشکلات احتمالی جلوگیری می کند. یکی از مشکلات Garbage Collector است! فرض کنید دستورات شما برای آزاد سازی منبع به سرعت انجام نشود و کمی طولانی شود و از طرف دیگر Garbage Collector که موازی اجرا شده است برای حذف شئ شما در نیمه ی کار سر می رسد. خودتان تصور کنید که چه مشکلات غیر قابل پیش بینی می تواند رخ دهد. اما با استفاده از IDisposable در هنگام استفاده از Dispose به Garbage Collector اطلاع داده می شود که عمل آزاد سازی صورت گرفته است و لازم نیست برای آزاد سازی این شئ کاری انجام دهد.

نکته دیگر اینکه:
گاهی اوقات زمان آزادسازی (قطعیت) اهمیت ندارد و فقط لازم است در هنگام آزاد سازی چند عمل دیگر انجام شود. به عبارت دیگر وقتی Garbage Collector برای آزاد سازی اقدام می کند، قبل از آن کارهای دیگری نیز انجام شود. برای این کار کافیست از finalizer استفاده کنید.

~MyClass()
{
    // Clean Up Here
    // Or Just Call Dispose()
}


موافقین ۰ مخالفین ۰ ۹۲/۰۶/۰۴
cscience

سیشارپ

C#

نظرات (۱)

عالی ممنون :)

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی