هل استدعاء Clear Disping العناصر أيضًا؟
-
21-09-2019 - |
سؤال
في كثير من الأحيان هناك طريقة واضحة ، تزيل جميع العناصر من المجموعات ، هل هذه العناصر التي يتم التخلص منها أيضًا.
مثل،
toolStripMenuItem.DropDownItems.Clear();
كافية ، أو يجب أن أتصل بهذا:
foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
toolStripMenuItem.DropDownItems.Remove(item);
item.Dispose();
}
تحرير: Well ToolStripItem هو مثال ليس سؤالًا ، بالنسبة لأولئك الذين يقولون إن Clear يكفي ، لقد وجدت مثالًا آخر ، يحتوي TabControl أيضًا على مجموعة العناصر وطريقة واضحة. لكن يمكن أن يكون لدى TabControls عناصر تحكم معقدة (على الأقل لدي) ، والتي يجب التخلص منها صراحة (حتى لو تم التخلص منها تلقائيًا في مرحلة ما بواسطة GC ، لأنها تأخذ ذاكرة ضخمة). أعتقد أن أفضل إجابة هي تعليق Divo للتخلص من العناصر ، ثم اتصل بـ Clear.
المحلول
س: يفعل؟
أ: لا - Clear
لا تتخلص من العناصر (يمكن استخدامها في أجزاء أخرى من التطبيق الخاص بك).
لذلك ، إذا كانت ToolStripItems قياسية .NET ، ينبغي Clear
كن كافيا؟ بعد بعض التفكير ، أقول "ربما لا".
نعم ، هذا صحيح أنه إذا كان لديك أي إشارات إلى toolstripitem في جزء آخر من التطبيق الخاص بك ، فإن .NET جامع القمامة سوف يدمر (استخدم الفصل المدمرة) تلقائيا. ولكن ، هو لن يتصل Dispose(true)
طريقة, ومع ذلك ، فهذا مطلوب للشكل IDisposable
عناصر.
في الواقع ، أعتقد أنك ستحتاج بشكل صريح Dispose
عناصرك ، مثل ToolStrip's تخلص الطريقة لا (استبدال هذه بواسطة yourtoolstrip):
if (!this.Items.IsReadOnly)
{
for (int i = this.Items.Count - 1; i >= 0; i--)
{
this.Items[i].Dispose();
}
this.Items.Clear();
}
تعديل
لقد خلقت أيضا الموضوع التالي لتوضيح هذا السؤال بشكل عام.
نصائح أخرى
يجب أن تعتمد عليها Dispose()
اتصل عندما تتعامل مع الذاكرة غير المدارة أو الموارد المشتركة أو مناطق الذاكرة الكبيرة. لا يبدو هذه الحالة.
الدعوة Clear
لا يتخلص من العناصر ، لكنه يزيل المرجع من المجموعة إلى العناصر. إذا كانت هذه هي الإشارة الوحيدة للعناصر التي سيتم جمعها القمامة تلقائيًا في مرحلة ما (والتي لا يمكنك التنبؤ بها ، ولكن يمكنك التحكم في استخدام GC
صف دراسي).
لا أعتقد ذلك ، أكثر ، يمكن أن يسبب العديد من المشكلات المنطقية لأنه قد يكون لديك إشارة إلى هذا الكائن في المجموعة للاستخدام لاحقًا. إذا لم يكن لديك إشارات إلى أن جامع القمامة الكائنات سوف يتخلص من تلك الكائنات لاحقًا