سؤال

هل من الضروري إدارة عمر كائنات System.Drawing يدويًا؟

أستخدم حاليًا عبارات "استخدام" لتقليل عمر الفرش وكائنات الرسم الأخرى، على سبيل المثال.

using ( Brush br = new SolidBrush( color ) )
{
    // Do something with br
}

هل هذا ضروري أم أنه من الآمن السماح لجامع القمامة بعمل سحره عندما يحتاج إلى ذلك؟

وبعيداً عن السؤال..ما الذي يعتقده الناس هو أنظف طريقة لتحقيق ذلك؟

هل كانت مفيدة؟

المحلول

إنها جيد للتخلص من كائن System.Drawing، ولكن إذا فاتتك كائن أو اثنين عندما تحصل على استثناء وما إلى ذلك، فهذه ليست نهاية العالم.(كائنات أخرى مثل الملفات المفتوحة واتصالات قاعدة البيانات يجب دائما يتم التخلص منها)

إن وجود الكثير من عبارة "الاستخدام" في جميع أنحاء التعليمات البرمجية الخاصة بك يجعل الأمر أكثر تعقيدًا للفهم.لذلك أود في حالة كائن System.Drawing، يعتبر فقط قم باستدعاء Dispose() عليها في نهاية الطريقة.

في الماضي، استخدمت فئة كتبتها "Dustcart"، والتي تنفذ IDisposable، وتحتوي على مجموعة من الكائنات التي يجب التخلص منها.يمكنك بعد ذلك كتابة كود مثل:

using(var dustcart = new Dustcard())
{
   var p = dustcart.Add(new Pen(red, etc));
   var b = dustcart.Add(new Brush(black));

   Pen t;
   if (someFlag)
   {
      t = p;
   }
   else
   {
      t = dustcard.Add(new Pen(etc));
   }
}

نصائح أخرى

عند كائن غير IDisposable، فمن الأفضل للتخلص في أقرب وقت كما كنت لا حاجة إليها أكثر من ذلك. (وتنفذ IDisposable لسبب ما).

وOffcourse، عندما كنت قد نسيت لاستدعاء تخلص، جامع القمامة لن تفعل عملها في بعض الوقت، وتنظيفه، بحيث يتم تحرير الموارد، ولكنك لا يمكن أبدا أن أقول أو تخمين عند جامع القمامة سوف ركلة في، فإنه ليس حتمية.

وهكذا، ونصيحتي هي: دعوة تخلص يدويا (مثل تفعلونه الآن) في أقرب وقت كما كنت لا تحتاج الكائن القابل للتصرف أي أكثر

.

والقاعدة العامة التي تقضي بجعل هو أنه إذا كان الكائن تنفذ IDisposable تحتاج لتنظيفه. لم يتم تنفيذ IDisposable لمجرد نزوة في .NET Framework - هناك أسباب وجيهة لذلك أن يكون هناك

.

وكما قال آخرون: عند إنشاء كائن IDisposable، يجب أن تخلص في أقرب وقت ممكن. في مثال محدد، إذا هو معروف لون في وقت الترجمة، يمكنك استخدام فرشاة القياسية مثل فرشاة ر = Brushes.Blue التي لا تحتاج إلى التخلص منها.

إذا كنت إعادة استخدام نفس اللون مرارا وتكرارا هل يمكن تخزين فرشاة كعضو مستوى الدرجة، ولكن هذا يعني أن الطبقة المالكة يجب أن يكون IDisposable جدا، والتخلص عضو الفرشاة في انها طريقة التخلص منها. وهذا من شأنه زيادة تخزين الذاكرة (حسب حجم فرشاة واحدة)، ولكن قد تقليل كمية من التعليمات البرمجية (أي بيانات باستخدام لكن تجاوز تخلص إضافية).

وأنا باستخدام "باستخدام" البيان كما وصفته أنت في سؤالك لضمان أن أمامي، القلم، الخط، مهما كانت الموارد والتخلص منها بشكل سليم. في قانون بلدي، أجد العبارات باستخدام أنظف من وجود صريحة المكالمات .Dispose () المنتشرة في جميع أنحاء. ولكن هذا مجرد تفضيل بلدي.

وأنا أتفق مع الإجابات أعلاه على الرغم من: بغض النظر عما إذا كنت تفضل استخدام البيانات أو المكالمات .Dispose، من المهم جدا لتنظيف الموارد يدويا، بدلا من الاعتماد على جمع القمامة. (كنت تعتمد على جمع القمامة في أولى المشاكل وأداء بدأت تطفو على السطح، حتى قبل الأشياء في التطبيق تم الحصول على معقدة.)

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