نقل قول نوشته شده توسط forodo مشاهده تاپیک
خیلی ممنون بابت توضیحاتتون.
پس یعنی اگر شی را با استفاده از new درست کنیم اصلاً کاری به اون شی نداشته باشیم چون فضای اشغال شده توسط اون شی خود به خود آزاد می شه مثل:
        ali a = new ali();
SqlConnection con = new SqlConnection();
DataSet ds = new DataSet();
TextBox tb = new TextBox();
PersianCalendar pc = new PersianCalendar();

ولی موقعی که از توابع API استفاده می کنیم خودمون باید فضا رو آزاد کنیم.
درست گفتم؟
1) اگه کلاس مورد نظر شما IDisposable رو پیاده سازی نکرده باشه، مثل کلاس ali، شما کلا نمیتونید Dispose رو انجام بدین چون چنین متدی اصلا وجود نداره.آزاد سازی رو GC زمانی که خودش تشخیص بده انجام میده.
2) اگه کلاس مورد نظر IDisposable رو پیاده کرده باشه، شما "میتونید" که بعد از اینکه کارتون رو با شی انجام دادین اصلا کاری بهش نداشته باشید.در نهایت GC با تشخیص خودش متد Dispose شی رو فراخوانی میکنه و منابع Unmanaged شی آزاد میشه و حافظه اختصاص داده شده هم که Managed Resource هست باز توسط GC آزاد میشه.
ولی به این نکته توجه کنید که شی ای که ایجاد کردین احتمالا منابع Unmanaged ی رو در اختیار داره که بهتره هرچه زودتر آزاد بشن. (برای مثال یک SqlConnection یک ارتباط با دیتابیس ایجاد کرده) بنابراین که اگه شما دیگه احتیاجی به اون شی ندارین، بهتره که بلافاصله با فراخوانی Dispose (یا استفاده از using) باعث بشین تا "منابع مدیریت نشده" آزاد بشن.
دقت کنید که فراخوانی Dispose باعث نمیشه حافظه Managed اختصاص داده شده به شی همون موقع آزاد بشه.حافظه مدیریت شده، همونطور که از اسمش پیداس توسط GC مدیریت میشه و فازغ از اینکه شما Dispose رو فراخوانی کنید یا نه در زمان غیر قابل پیشبینی آزاد میشه.
درضمن منابع مدیریت نشده لزوما توسط توابع API اختصاص داده نمیشن...
نقل قول نوشته شده توسط forodo مشاهده تاپیک
حالا متد dispose کداش چیه؟
در مورد IDisposable میتونید اینجا مطالعه کنید: http://msdn.microsoft.com/en-us/libr...isposable.aspx
IDispsable رو به این صورت میشه پیاده کرد:

class MyDisposableClass : IDisposable
{
// Flag: Has Dispose already been called?
bool disposed = false;

// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;

if (disposing) {
// Free any other managed objects here.
//
}

// Free any unmanaged objects here.
//
disposed = true;
}
}

همونطور که میبینید دو محل برای ازاد سازی منابع مدیریت شده و مدیریت نشده هست که بایستی توسط کلاس مورد نظر پیاده ب

نقل قول نوشته شده توسط forodo مشاهده تاپیک
و اگر نخوایم از کلاس اینترفیس IDisposable ارث بری کنه، می تونیم توی برنامه اینطوری بنویسیم؟
کلاسی داریم که کداش اینه:
class ali
{
public void alireza()
{
messagebox.show("test");
}
}





حالا که ما توی این کلاس متد dispose نداریم توی برنامه از using استفاده کنیم همون کار رو انجام می ده؟
using (ali a=new ali())
{
a.alireza();
}



خیر، کلاس شما اگه IDisposable نباشه نمیتونید اصلا در using قرارش بدین.
نقل قول نوشته شده توسط forodo مشاهده تاپیک
الان اینجوری فضای اشغال شده توسط شی a از حافظه کامپیوتر پاک می شه؟
خیر، باز هم میگم، با فراخوانی Dispose یا استفاده از using حافظه اختصاص داده شده به شی (که جزو Managed Resource) هست آزاد نمیشه، فقط منابع مدیریت نشده آزاد میشن.
حافظه اختصاص داده شده به شی در هر صورت توسط GC و در زمان غیر قابل پیش بینی آزاد میشه.