سؤال

ممكن مكررة:
ما هي C# باستخدام كتلة لماذا يجب استخدامه ؟

لقد رأيت العبارة باستخدام المستخدمة في منتصف codeblock ما هو السبب في ذلك ؟

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

المحلول

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

    //the compiler will create a local variable 
    //which will go out of scope outside this context 
    using (FileStream fs = new FileStream(file, FileMode.Open))
    {
         //do stuff
    }

وبدلا من ذلك يمكنك فقط استخدام:

    FileStream fs;
    try{
       fs = new FileStream();
       //do Stuff
    }
    finally{
        if(fs!=null)
           fs.Dispose();
    }

المزيد من القراءة من MSDN

C# من خلال .NET Framework وقت تشغيل اللغة العامة (CLR) ، تلقائيا تطلق الذاكرة تستخدم لتخزين الأشياء التي لم تعد مطلوبة.الإفراج عن الذاكرة غير القطعية;يتم تحريرها الذاكرة كلما CLR تقرر إجراء جمع القمامة.ومع ذلك ، فمن الأفضل عادة إلى إطلاق سراح محدودة الموارد مثل ملف مقابض اتصالات الشبكة في أسرع وقت ممكن.

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

نصائح أخرى

وغالبا ما تستخدم عند فتح اتصال إلى تيار أو قاعدة بيانات.

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

using (Stream stream = new Stream(...))
{


}

مع هذا المثال ، ستريم مغلقة بشكل صحيح بعد كتلة.

باستخدام هي محاولة أخيرا syntaxical السكر عن أي شيء يحتوي على IDisposable..مثل sqlconnection.استخدامه تأكد من شيء يتم التخلص بعد من using(){} نطاق.

using(SqlConnection conn = new SqlConnection(connString))
{
  //use connection
}

//shorter than

SqlConnection conn = new SqlConnection(connString)
try
{
  //use connection 
}
finally
{
    conn.Dispose();
}

العبارة باستخدام يضمن كائن يتم التخلص منها بشكل صحيح مرة واحدة فمن تعود المطلوبة.انها في الأساس يوفر عليك كتابة الكائنات.Dispose () ؛ ويعطي دليل مرئي كما أن نطاق الاستخدام من متغير.

انظر MSDN الصفحة للحصول على مزيد من المعلومات

هذا النموذج من استخدام له علاقة مع تحرير الموارد.لا يمكن إلا أن تستخدم في تركيبة مع الطبقة التي تنفذ واجهة IDisposable.

على سبيل المثال:

using(SqlConnection conn = new SqlConnection(someConnectionString))
{
     //Do some database stuff here
}

في نهاية باستخدام كتلة conn.التخلص يطلق عليه ، حتى إذا تم طرح استثناء داخل الكتلة.في حالة SwqlConnection كائن يعني أن الاتصال هو دائما مغلقة.

عيب هذا البناء هو أن هناك الآن وسيلة لمعرفة ما حدث.

آمل أن يساعد هذا يجيب على سؤالك ؟

كلما التعليمات البرمجية بإنشاء كائن التي تطبق IDisposable يجب أن التعليمات البرمجية لا خلق داخل الحي ، كما رأينا أعلاه.

هناك استثناء واحد لهذه القاعدة.خطأ في تصميم WCF فئات وكيل يمنع استخدام البيانات من كونها مفيدة الوكيل الطبقات.باختصار أسلوب التخلص على فئة وكيل قد رمي استثناء.WCF فريق لا يرى أي سبب لعدم التصريح هذا.

للأسف لا أرى سببا لا يعني أن هناك هو بدون سبب:

try
{
    using (var svc = new ServiceReference.ServiceName())
    {
        throw new Exception("Testing");
    }
}
catch (Exception ex)
{
    // What exception is caught here?
}

إذا ضمني التصرف دعوة يطرح استثناء ، ثم كتلة catch قبض أن استثناء بدلا من واحدة القيت داخل باستخدام كتلة.

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