هل سيتم استدعاء التخلص من المتغيرات المجهولة؟

StackOverflow https://stackoverflow.com/questions/803381

  •  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 في النهاية بجمع الكائن وتلاحظ أنه يمكن نهائيًا (يمكن النهائي ، أليس كذلك؟) وسيقوم بإنهائه من أجلك. التخلص هو لتنظيف الموارد بشكل حتمي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top