تفاوت میان متدهای Finalize و Dispose
دو متد Finalize و Dispose برای آزادسازی منابع کنترل نشده توسط یک شی، مورد استفاده قرار می گیرند.
در این مقاله قصد داریم تفاوت های موجود در استفاده از این دو متد را بیان کنیم.
اولین تفاوتی که وجود دارد این است که متد dispose() در اینترفیس IDisposeable تعریف شده است در حالیکه متد finalize() در داخل کلاس object تعریف شده است.
اجازه بدهید حالا که میدانیم هر کدام از این متدها در کجا تعریف شده اند به مقایسه دقیق تر تفاوت های آنها در پیاده سازی، عملکرد و ساختار دستوری آنها بپردازیم.
همانطور که گفتیم متد dispose() برای آزاد سازی منابع مدیریت نشده یک شی بکار می رود. این منابع مدیریت نشده میتوانند فایل ها، اتصال های برقرار شده با پایگاه داده و... باشند.
با توجه به این که متد dispose() بطور اتوماتیک صدا زده نمی شود و از آنجایی که این متد در اینترفیس IDisposeable تعریف شده است بنابراین باید آنرا در کلاسی که اینترفیس IDisposeable را پیاده سازی میکند تعریف کنیم.
- public void dispose( ){
- // Dispose code here
- }
همانطور که در کد بالا میبینید متد بصورت public تعریف شده است. علت اینکار به این دلیل است که این متد باید در کلاسی تعریف شود که اینترفیس IDisposable پیاده سازی می کند، بنابراین ، برای دستیابی به آن ، متد به صورت عمومی اعلام می شود.
حالا که متد را تعریف کردیم میتوان در هر زمانی آنرا فراخوانی کرد و این یکی دیگر از تفاوت های متد dispose() و finalize() است چرا که متد finalize() بطور اتوماتیک صدا زده میشود. درواقع متد finalize() توسط garbage collector فراخوانی میشود. garbage collector نوعی مدیریت حافطه در c# است که وظیفه ی مدیریت آبجکت های داخل حافظه را بر عهده دارد و آبجکت های بلااستفاده را پیدا میکند فضای اشغال شده آنها را آزاد می کند، شایان ذکر این فرایند به صورت خودکار در یک Thread کنار برنامه انجام میشود و زمانی که فضای آزاد اختصاص داده شده به برنامه، به یک حد مشخصی برسد این فرایند به صورت خودکار انجام میشود. همین امر باعث میشود که کارایی و سرعت متد dispose() از finalize() بیشتر باشد.
فراخوانی متد finalize() بطور اتوماتیک به این صورت است که garbage collector زمانی که شروع به حالی کردن حاقظه میکند متد finalize() را قبل از، ازبین بردن کامل یک شی فراخوانی میکند.
ساختار دستوری متد finalize() بصوزت زیر است
- protected void finalize( ){
- // finalization code here
- }
همانطور که میبینید متد بصورت protected تعریف شده است دلیل این امر این است که ، متد finalize() نباید از خارج از کلاس در دسترس باشد و این دسترسی فقط باید برای garbage collector باشد.
در یک جمع بندی میتوان استفاده از متد dispose() را پیشنهاد کرد. این متد را میتوانید در هر زمانی که نیاز دارید فراخوانی کنید. همچنین متد dispose() بهینه تر از متد finalize() است چرا که بلافاصله بعد از فراخوانی متد dispose() آزادسازی منابع انجام میشود اما متد finalize() تا زمان فعالیت garbage collector اجرا نخواهد شد. همچنین سرعت متد dispose() در آزاد سازی منابع بیشتر از finalize() است.

دیدگاه کاربران