سؤال

أنا منزعج حقًا من الاضطرار إلى العش using كتل في C#. إنه ليس أنيقًا ويستغرق مساحة كبيرة. في بعض الحالات ، يبدو أنه أمر لا مفر منه لأنني بحاجة إلى إعلان متغيرات أنواع البيانات المختلفة ، ولكن يبدو أن الحالة من النوع الواحد يجب أن تكون ممكنة. ما أعنيه بـ "الحالة الفردية" هو عندما يتم الإعلان عن عدة متغيرات من نفس النوع في السلسلة. إليك مثال على ما أتحدث عنه:

class Program
{
    static void Main(string[] args)
    {
        using (A a = new A("a"), b = new A("b"))
        {
        }
    }

    class A : IDisposable
    {
        string n = null;
        public A(string name)
        {
            n = name;
            Console.WriteLine(String.Format("Creating {0}", n));
        }

        public void Dispose()
        {
            Console.WriteLine(String.Format("Disposing {0}", n));
        }
    }
}

الطريقة التي أريد أن تعمل بها هذا a تم بناؤه من قبل b, ، وذلك b يتم التخلص منه من قبل a. لسوء الحظ ، لا يبدو أن هناك أي اتجاه في مواصفات C# حول كيفية حدوث ذلك بالفعل. يبدو كما لو أن برنامج التحويل البرمجي C# من Microsoft يعامله مثل هذا ، لأن هذا هو إخراج تشغيل البرنامج أعلاه:

Creating a
Creating b
Disposing b
Disposing a

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

هناك بالفعل سؤال مماثل حول التخلص الحتمي يتحدث ذلك عن الحالة المتعددة من النوع ، وأنا أفهم أنه لا يوجد حل حقيقي بصرف النظر عن حيل بناء الجملة الذكية. معظم الإجابات هناك تفوت هذه النقطة ، على أي حال. سؤالي هو مجرد حالة من النوع الواحد وما إذا كان هذا التخلص هو حتمي ويمكن الاعتماد عليه أم لا. شكرًا.

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

المحلول

من C# المواصفات:

using بيان النموذج using (ResourceType r1 = e1, r2 = e2, ..., rN = eN) يعادل بدقة تسلسل متداخل using صياغات:"

using (ResourceType r1 = e1)
   using (ResourceType r2 = e2)
      ...
         using (ResourceType rN = eN)
            statement

لذلك يبدو من العدل أن نقول أن هذا محدد تمامًا.

نصائح أخرى

هل هناك أي سبب لعدم استخدام الخدعة متعددة الاستخدامات؟ هذا حتمي تمامًا ، ويحل مشكلتك

using (A a = new A("a"))
using (A b = new A("b")) {
    // ....
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top