سؤال

ما هو الفرق بين اثنين التالية قصاصات من التعليمات البرمجية:

using (Object o = new Object())
{
    // Do something
}

و

{
    Object o = new Object();
    // Do something
}

لقد بدأت باستخدام using الكثير ولكن أنا الغريب ما في الواقع الفوائد بالمقارنة مع تحديد النطاق الكائنات.

تحرير: الحكايات المفيدة أخذت من هذا:

جون السكيت:

لاحظ أن هذا لا قوة جمع القمامة في أي طريقة أو شكل.جمع القمامة و موجه الموارد تنظيف نوعا ما متعامد.

سوف Eddins التعليق:

إلا فئة تنفذ واجهة IDisposable, وقد تخلص() وظيفة ، كنت لا تستخدم لامتداد.

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

المحلول

أول مقتطف المكالمات Dispose في نهاية كتلة يمكنك أن تفعل ذلك فقط مع الأنواع التي تنفذ IDisposable, ، وهي أساسا المكالمات Dispose في النهاية كتلة, بحيث يمكنك استخدامه مع الأنواع التي تحتاج إلى موارد تنظيف, على سبيل المثال

using (TextReader reader = File.OpenText("test.txt"))
{
    // Use reader to read the file
}
// reader will be disposed, so file handle released

علما أن هذا لا لا قوة جمع القمامة في أي طريقة أو شكل.جمع القمامة و موجه الموارد تنظيف نوعا ما متعامد.

في الأساس, يجب عليك استخدام using بيان من أجل أي شيء تقريبا التي تنفذ IDisposable والتي كتلة التعليمات البرمجية الخاصة بك هو الذهاب إلى تحمل مسؤولية (من حيث التنظيف).

نصائح أخرى

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

تحرير:العيب النطاق هي:

  • لا تحكم التصرف في وجوه
  • حتى إذا كنت استدعاء التصرف في نهاية النطاق الخاص بك, فإنه لن يكون استثناء آمنة

فقط حرفيا تظهر الفرق...

using (FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate))
{
  //stuff with file stream
}

هو نفس...

{
  FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);

  try
  {
    //stuff with filestream
  }
  finally
  {
    if (fileStream != null)
      ((IDisposable)fileStream).Dispose();
  }
}

حيث

{
  FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);
  fileStream.Dispose();
}

هو كما هو.

راجع الوثائق المتعلقة IDisposable و للتحديد الموارد deallocation.

ببساطة ، في نهاية using{} كتلة, يمكنك موثوق التصرف في الموارد المخصصة (على سبيل المثالإغلاق ملف مقابض اتصالات قاعدة البيانات.... الخ)

using فقط يتطلب تنفيذ واجهة IDisposable ، ويدعو أسلوب التخلص في نهاية نطاق.

عن الكثير من مستعرة الجدل حول صحيح التصرف في الكائنات ، هناك الكثير من المواضيع الأخرى.

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