أمر التخلص في C# باستخدام الكتل
-
27-09-2019 - |
سؤال
أنا منزعج حقًا من الاضطرار إلى العش 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
ومع ذلك ، ليس لدي أي طريقة لضمان أن هذا هو السلوك الحتمي. هل يمكن لأي شخص أن يؤكد أو يدحض فكرة أن هذا التسلسل حتمي؟ المراجع ستكون رائعة. ومن الواضح أنه إذا كان من المعرض الكسر (غير الموثق ، وما إلى ذلك) ، فربما لا يكون مفيدًا ، لكن هذا أمر جيد أن نعرفه.
هناك بالفعل سؤال مماثل حول التخلص الحتمي يتحدث ذلك عن الحالة المتعددة من النوع ، وأنا أفهم أنه لا يوجد حل حقيقي بصرف النظر عن حيل بناء الجملة الذكية. معظم الإجابات هناك تفوت هذه النقطة ، على أي حال. سؤالي هو مجرد حالة من النوع الواحد وما إذا كان هذا التخلص هو حتمي ويمكن الاعتماد عليه أم لا. شكرًا.
المحلول
"أ 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")) {
// ....
}