سلام
برای استفاده از using کلاس ما باید واسط IDisposable پیاده سازی کند.
(که میدانیم واسط مذکور فقط یک متد بدون ورودی و خروجی به نام Dispose دارد.)
در #C به دو شکل صریح و ضمنی میتوان یک واسط را پیاده سازی کرد و تا آنجا که به دات نت مربوط است برای او تفاوتی ندارد!
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همانطور که شماهده میکنید در نوع ضمنی هیچ اشاره ای به واسط مرتبط با متد نوشته نمیشود و کامپایلر #C بطور خودکار و فقط از روی نام و امضای متد تشخیص میدهد که متدپیاده سازی شده همان متد واسط است.
در این شیوه باید متد مذکور public و دقیقاً هم نام متد واسط باشد.
در شیوه صریح، خود برنامه نویس به صراحت ذکر میکند که در حال پیاده سازی فلان متد از فلان واسط است، ولی این شیوه تعریف متد بدون cast غیر قابل دستابی می باشد. (بعداً از این نوع صریح میتوان به پیاده سازی با نام دلخواه هم رسید)
اگر بخواهید دستی در کدتان متد را فوراً فراخوانی کنید شاید برای شما فرق کند:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی در کلیه موارد دیگر هیچ تفاوتی نمیکند، مثلاً کدهای زیر هم برای Class1 و هم Class2 به درستی کامپایل و کار میکند که برای جلوگیری از دوبار نوشتن کدها من از نام Class12 استفاده کردم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کی نیاز هست GC.SuppressFinilize رو فراخوانی کنیم؟
نیاز نیست! خودتان را درگیرش نکنید.
اگر از منابع unmanaged و نگه داری دستگیره های مربوطه مانند hIcon, hWnd, hBitmap, hConsoleInput, hFile و... آنهم در سطح متغییرهای کلاس استفاده نمیکنید، اصلاً متد Finilize کلاستان را override نکنید، آنگاه معنی و نیازی به GC.SuppressFinilize هم نخواهید داشت.
متدفوق به جمع آوری کننده حافظه هرز اطلاع میدهد که در زمان جمع آوری یک شی نیاز به اجرای متد Finilize و اجرای کدهای خاص سفارشی (#C یا VB.Net و...) نیست.
به بیان دیگر ما کار اضافه ای نداریم که بخواهیم زمان جمع آوری اجرا شود و نیاز نیست ما را مطلع کند.
شب خوش.