مشاهده نسخه کامل
: using در منابع مدیریت نشده
سلام
وقتی using به کار ببریم در اصل همان try catch Finally هست متها به صورت اتوماتیک به جای صریح!
حال برای کار با فایل ها ما متد Dispose رو اصلا اعلان نکردیم.چطوری عمل میکنه؟ منظورم اینه که بلاخره اید Dispose پیاده سازی بشه حالا طرز استفاده اش با به صورت ساختار try finally میهش یا using اما اینجا اصلا پیاده نکرده.چطور منبع ازاد میکنه?
آیا داخل خود کلاس FileStream متد Dispose رو خودش نوشته و منابع دریافت شده به صورت خودکار آزاد میشه؟
وقتی از using استفاده کردیم نیاز هست suppresfinilize هم فراخوانی کنیم؟ (کی نیاز هست GC.SuppressFinilize رو فراخوانی کنیم؟-> وقتی که بخواهیم دیگه زباله روب دوباره سعی در ازاد کردن منبع نکنه چون به صورت صریح ازاد کردیم منبع رو؟)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سلام
برای استفاده از 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 و...) نیست.
به بیان دیگر ما کار اضافه ای نداریم که بخواهیم زمان جمع آوری اجرا شود و نیاز نیست ما را مطلع کند.
شب خوش.
سلام
متاسفانه یک مورد را در مطالب قبلی سریع پاسخ دادم و اشتباه کردم...
کلاس FileStream واسط IDisposable بطور صریح (مشابه Class2 کدما) پیاده سازی کرده.
با توجه به اینکه از پست اول فوراً برداشت کردم متد Dispose را در FileStream مشاهده نکرده اید، سریع به ذهنم رسید حتماً پیاده سازی صریح داشته ....
ولی ساعاتی بعد از ارسال پست خودم یادم آمد که کلاس FileStream که وراثت کلاس Stream و ... شرمنده!
بهرحال بدین وسیله عضرخواهی و اصلاح میکنم:
کلاس FileStream وراثت کلاس Stream است و بطور ضمنی واسط IDisposable را پیاده سازی کرده
(از کلاس پایه خود به ارث برده و متد بسیار مشابه ای را برای عملیات خود بازتعریف کرده)
==============
بدلیل عدم پشتیبانی p30 از تگ strike در bbcode متن اشتباه از پست قبلی حذف شد.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.