[c#] هل يجب علي الاتصال بـ Close () أو Dispose () لكائنات البث؟



1 Answers

لا ، لا يجب عليك استدعاء هذه الطرق يدويًا. في نهاية كتلة الاستخدام يتم استدعاء طريقة التخلص تلقائيًا والتي ستهتم بموارد مجانية غير مدارة (على الأقل لفئات .NET BCL القياسية مثل التدفقات والقراء / الكتّاب ...). لذا يمكنك أيضًا كتابة شفرتك على النحو التالي:

using (Stream responseStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(responseStream))
        using (StreamWriter writer = new StreamWriter(filename))
        {
            int chunkSize = 1024;
            while (!reader.EndOfStream)
            {
                 char[] buffer = new char[chunkSize];
                 int count = reader.Read(buffer, 0, chunkSize);
                 if (count != 0)
                 {
                     writer.Write(buffer, 0, count);
                 }
            }
         }

يستدعي أسلوب Close Dispose.

Question

تقوم فئات مثل Stream و StreamReader و StreamWriter بتنفيذ واجهة IDisposable . وهذا يعني أنه يمكننا استدعاء طريقة Dispose() على كائنات من هذه الفئات. لقد قاموا أيضًا بتعريف طريقة public تسمى Close() . الآن هذا يربكني ، ما الذي يجب أن أسميه بمجرد انتهائي من الأشياء؟ ماذا لو اتصلت بهما؟

رمزي الحالي هو:

using (Stream responseStream = response.GetResponseStream())
{
   using (StreamReader reader = new StreamReader(responseStream))
   {
      using (StreamWriter writer = new StreamWriter(filename))
      {
         int chunkSize = 1024;
         while (!reader.EndOfStream)
         {
            char[] buffer = new char[chunkSize];
            int count = reader.Read(buffer, 0, chunkSize);
            if (count != 0)
            {
               writer.Write(buffer, 0, count);
            }
         }
         writer.Close();
      }
      reader.Close();
   }
}

كما ترين ، لقد كتبت using() بنيات ، والتي تقوم تلقائيًا باستدعاء أسلوب Dispose() على كل كائن. لكنني أيضا استدعاء أساليب Close() . هل هذا صحيح؟

يرجى اقتراح أفضل الممارسات عند استخدام كائنات البث. :-)

مثال MSDN لا يستخدم using() بنيات ، وطريقة Close() :

هل هذا جيد؟




في العديد من الفئات التي تدعم كل من أساليب "الإغلاق والتخلص" ، ستكون المكالمتين متساويتين. في بعض الفئات ، ومع ذلك ، من الممكن إعادة فتح كائن تم إغلاق Close'd. بعض هذه الطبقات قد تبقي بعض الموارد على قيد الحياة بعد الإغلاق ، من أجل السماح بإعادة فتح. قد لا يحتفظ الآخرون بأي موارد على قيد الحياة عند الإغلاق ، ولكن قد يضعوا علامة على Dispos (رفض) لمنع إعادة فتحها بشكل صريح.

يتطلب العقد الخاص بـ IDisposable.Dispose صراحة أن استدعائه على كائن لن يتم استخدامه مرة أخرى أبداً سيكون في أسوأ حالاته غير مؤذية ، لذلك أوصي بالاتصال إما بتعريف قابل للتعميم.أسلوب أو طريقة تسمى Dispose على كل كائن قابل للتعريف ، سواء كان ذلك الشخص أو لا المكالمات




Related