هل سيتم استدعاء التخلص من المتغيرات المجهولة؟
-
03-07-2019 - |
سؤال
فمثلا،
int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);
لا يوجد استخدام كتلة ، لا توجد طريقة واضحة لاستخدام كتلة باستخدام ، لا توجد طريقة واضحة للاتصال Dispose (). وبالطبع ، فإن UnganagedResourceusingMemorysuckingPig لا ينفذ idisposable.
المحلول
إذا استدعاء نهائيات تلك الفئة Dispose()
, ، نعم. إذا لم يكن كذلك ، لا.
(تعديل) القليل فقط معلومات إضافية:
لا تفترض أنه سيتم استدعاء التخلص. يجب أيضًا إصدار الموارد غير المدارة التي يملكها نوع ما في طريقة نهائية في حالة عدم استدعاء Dispose.
يحرر
لتوضيح التعديل أعلاه ، رأيت الكثير من الناس (في هذا الموضوع ، على ذلك ، وفي مكان آخر) يدعي أن "GC سوف يتصل Dispose()
عند إزالة الكائن. "هذا ليس هو الحال على الإطلاق. نعم ، المبرمج الدفاعي الجيد الذي يكتب مكونًا سيفترض ذلك Dispose()
لن يتم استدعاؤها بشكل صريح ويفعل ذلك في النهائي. ومع ذلك ، يجب أن يفترض المبرمج الدفاعي الجيد الذي يستخدم مكونًا أن Finalizer لا يتصل Dispose()
. لا يوجد دعوة تلقائية لـ Dispose()
في جامع القمامة. هذه الوظيفة موجودة فقط إذا استدعاء Finalizer Dispose()
.
نصائح أخرى
لا أصدق ذلك. عليك أن تكتب:
using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig())
{
myResult= urumsp.GetThingsDone(id);
}
يمكنك فقط التأكد من أنه إذا كان لديه نهائي (Destructor) ، فسيتم استدعاء ذلك. يجوز للاتصال النهائي بالاتصال Dispose()
لكن التنفيذ المعتاد هو أن كلا من النهائيات و Dispose()
مكالمة protected Dispose(bool)
.
بمعنى آخر ، يعتمد ذلك على تنفيذ UnmanagedResourceUsingMemorySuckingPig
، إذا اتبع الإرشادات ، فسيتم تنظيف الكائن المجهول ، ولكن ليس بكفاءة كما هو الحال مع أ using
الكتلة.
لا. ومع ذلك ، ستقوم GC في النهاية بجمع الكائن وتلاحظ أنه يمكن نهائيًا (يمكن النهائي ، أليس كذلك؟) وسيقوم بإنهائه من أجلك. التخلص هو لتنظيف الموارد بشكل حتمي.