سؤال

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

ومع ذلك، عندما DownloadString الطريقة، الموضحة في المثال أدناه، تطرح a WebException, ، يتعطل البرنامج.

using (WebClient client = new WebClient())
{
    string response = client.DownloadString(url);
    // ...
}

وهذا أمر طبيعي، منذ using البيان لا يعمل مثل try/catch/finally, ، فلن تتم معالجة أي استثناء في الواقع.ولكن بعد ذلك أتساءل ما هو الغرض من using إفادة.

تحديث... واستنادا إلى الردود الواردة أدناه، أضيف الاعتبارات التالية.في الأساس، إذا كنت بحاجة إلى التعامل مع استثناء، يمكن أن تكون الحلول الممكنة على النحو التالي.

  1. ضع ال using بيان داخل أ try/catch حاجز.
  2. ضع فقط DonwloadString الطريقة داخل أ try/catch حاجز.
  3. اكتب يدويًا كتلة محاولة/التقاط/أخيرًا كما في نموذج التعليمات البرمجية التالي.

نموذج التعليمات البرمجية للحل الثالث.

WebClient client = new WebClient();
try
{
    string response = client.DownloadString(url);
    // ...
}
catch(Exception ex)
{
    // handle (or ignore) the exception
}
finally
{
    if (client != null)
        client.Dispose();
}
هل كانت مفيدة؟

المحلول

إذا فهمت بشكل صحيح، فإن عبارة الاستخدام تعمل مثل محاولة/أخيرًا

صحيح.

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

غير صحيح.

لا try/finally ولا using تبتلع العبارات الاستثناءات - إذا لم تتمكن من اكتشاف الاستثناء، فسوف ينتشر للأعلى.إذا لم يتم اكتشافه، فعادةً ما يتم إنهاء العملية.(هناك بعض الحالات التي لا يحدث فيها ذلك، بناءً على مؤشر الترابط الموجود فيه وكيفية تكوين CLR، ولكن هذه مسألة مختلفة.)

ولكن بعد ذلك أتساءل ما هو الغرض من عبارة الاستخدام.

لتسهيل كتابة التعليمات البرمجية التي تحتاج إلى التخلص من الموارد.هذا كل شئ.إذا لم يكن لدينا using البيانات، سيكون لدينا كثير ل try/finally الكتل التي دعت للتو Dispose...وسيكون ذلك أقبح بكثير.(لقد حدث ذلك - كان ذلك هو Java حتى قدم Java 7 بيان المحاولة باستخدام الموارد.)

نصائح أخرى

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

سيعيد طرح أي استثناءات تحدث، وسيظل يتعين عليك التعامل معها في التعليمات البرمجية الخاصة بك.

راجع وصف MSDN لـ using إفادة

باختصار، الاستخدام يضمن ذلك .Dispose() يتم استدعاؤه حتى في حالة حدوث استثناء.ومع ذلك، فهو لا يمنع الاستثناء من القيام بعمله.

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

إنه ببساطة أسهل وأسرع في الاستخدام والقراءة

انظر بنفسك

var myVar = null
try
{
    my = new Object();
    //Do stuff
}
finally
{
    if(myVar != null)
        myVar.Dispose()
}

ضد

using(var myVar = new Object())
{
    //Do stuff
}

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

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