PDA

View Full Version : سوال: پیاده سازی متد Dispose در درون کلاس



Hybrid
سه شنبه 02 اسفند 1390, 12:54 عصر
با سلام خدمت دوستان عزیز امیدوارم حالتون خوب باشه.

یک کلاس طراحی کردم و میخوام این کلاس متد Dispose هم داشته باشه ، بعنی بعد از اینکه یک شی از این کلاس رو ساختم و از اون استفاده کردم بتونم حافظه اشغال شده توسط این شی رو آزاد کنم (از طریق متد Dispose ) . ممنون میشم کمکم کنید.

فرید نجفلو
سه شنبه 02 اسفند 1390, 13:38 عصر
سلام
اگه شما درست بعد از تعریف کلاستون خط زیر رو بنویسید و Enter بزنید هم کد های لازم رو اضافه می کنه هم طریقه استفاده رو واستون کامنت کرده:
Implements IDisposable

Hybrid
سه شنبه 02 اسفند 1390, 13:50 عصر
ممنون دوست عزیز از کمکت ،

حالا دیگه لازم نیست کده اضافی بنویسم؟ ، یعنی خودش الان منابع رو آزاد میکنه ؟؟؟ از کجا مطمئن شم حتما منابع آزاد شدن؟؟؟

با تشکر

فرید نجفلو
سه شنبه 02 اسفند 1390, 14:23 عصر
دوست عزیز شما با پیاده سازی این اینتر فیس به JIT و کامپایلر و استفاده کننده از کلاستون اطلاع و اطمینان می دید که منابعی رو که کلاستون در اختیار گرفته رو آزاد می کنید
یعنی شما خودتون باید این کا رو انجام بدید
این کار رو هم باید در متد زیر انجام بدید(و تنها جایی است که شما باید کد بنویسید در متد های دیگر که یکیشون هم کامنت شده نباید کد بنویسید)


' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
End If
' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub


در قسمت شرطی شما منابع مدیریت شده(که خودش یه بحث جداست) آزاد می کنید برفرض مثال ممکنه شما یک فایل رو باز کردین ولی بسته نشده باید ببندید یا یک اتصال به پایگاه داده دارید یا ...
اگه خواستین خارج از قسمت شرطی که برای آزاد کردن منابع غیر مدیریت شده است استفاده کنید باید متد Finalize رو آن کامنت کنید(البته داخلش لازم نیست کد بنویسد) برای مثال ممکنه شما یک متغیر با محتوایی پر حجم دارید که ممکنه به چند مگا بایت برسه این رو باید خودتون مستقیما و صریح آزاد کنید
به کامنت های TODO دقت کنید