System.IDisposable
این interface شما رو موظف می کنه که یک متد به نام Dispose به کلاستون اضافه کنید.
public void Dispose()
{
....
}
هدف از این کار release کردن unmanaged resources هست.
اگر کلاسی این interface را پیاده سازی کنه، قابلیت این رو داره که در بلوک using به کار گرفته بشه. در غیر این صورت کامپایلر اجازه ی این کار رو نمیده.
این دو نمونه کلاس رو نگاه کنید:
class myClass1 : IDisposable
{
...
public void Dispose()
{
...
}
}
class myClass2
{
...
public void Dispose()
{
...
}
}
هر دو شبیه هم هستند و تنها تفاوتشون اینه که myClass2 بر خلاف myClass1 از IDisposable ارث بری نکرده.(گرچه هر دو متد Dispose را دارا هستند)
حالا ببینیم عاقبتشون چی میشه. به هر دو using زیر نگاه کنید:
using (myClass1 mc1 = new myClass1())
{
....
}
using (myClass2 mc2 = new myClass2())
{
...
}
اولی بعد از اجرا ی بلوک، متد Dispose رو صدا می زنه.
اما دومی کارش به اینجاها نمیکشه. همون اول کامپایلر با این error متوقفش می کنه:
type used in a using statement must be implicitly convertible to 'System.IDisposable'
البته میشه آزادسازی دستی توسط متد Dispose را در بلوک های finally هم مشاهده کرد.
در زیر لیستی از کلاس هایی را می بینید که این interface را پیاده سازی کرده اند. چه کلاس های دیگری را هم در اطرافتون می شناسید دارید که این interface رو پیاده سازی کرده باشند؟
- BinaryReader
- BinaryWriter
- Brush
- Component
- Container
- Control
- Cursor
- Font
- Graphics
- Icon
- Image
- Matrix
- MessageEnumerator
- OdbcDataReader
- OdbcTransaction
- OleDbDataReader
- OleDbTransaction
- OracleDataReader
- OracleTransaction
- Pen
- Region
- Socket
- SqlCeCommand
- SqlCeConnection
- SqlCeDataReader
- SqlCeEngine
- SqlCeRemoteDataAccess
- SqlCeReplication
- SqlCeTransaction
- SqlDataReader
- SqlTransaction
- Stream
- TcpClient
- TextReader
- TextWriter
- Timer
- UdpClient
- WebResponse
--------------------------------------
این هم جواب هایی که برخی از دوستان دادند:
https://barnamenevis.org/showpo...17&postcount=6