ما هو الغرض من بيان الاستخدام؟
-
24-12-2019 - |
سؤال
وعلى أساس ما هو مكتوب على هذا صفحة على الإنترنت, ، وإذا فهمت بشكل صحيح، فإن using
البيان يعمل مثل try/finally
, ، لذلك قد أتوقع خطأً أنه في حالة حدوث استثناء في ملف using
البيان، لا ينبغي أن يتعطل البرنامج.
ومع ذلك، عندما DownloadString
الطريقة، الموضحة في المثال أدناه، تطرح a WebException
, ، يتعطل البرنامج.
using (WebClient client = new WebClient())
{
string response = client.DownloadString(url);
// ...
}
وهذا أمر طبيعي، منذ using
البيان لا يعمل مثل try/catch/finally
, ، فلن تتم معالجة أي استثناء في الواقع.ولكن بعد ذلك أتساءل ما هو الغرض من using
إفادة.
تحديث... واستنادا إلى الردود الواردة أدناه، أضيف الاعتبارات التالية.في الأساس، إذا كنت بحاجة إلى التعامل مع استثناء، يمكن أن تكون الحلول الممكنة على النحو التالي.
- ضع ال
using
بيان داخل أtry/catch
حاجز. - ضع فقط
DonwloadString
الطريقة داخل أtry/catch
حاجز. - اكتب يدويًا كتلة محاولة/التقاط/أخيرًا كما في نموذج التعليمات البرمجية التالي.
نموذج التعليمات البرمجية للحل الثالث.
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
كائن إذا حدث واحد.يعد هذا أمرًا مهمًا للتأكد من تحرير أي موارد غير مُدارة.
سيعيد طرح أي استثناءات تحدث، وسيظل يتعين عليك التعامل معها في التعليمات البرمجية الخاصة بك.
باختصار، الاستخدام يضمن ذلك .Dispose()
يتم استدعاؤه حتى في حالة حدوث استثناء.ومع ذلك، فهو لا يمنع الاستثناء من القيام بعمله.
لا تحتوي عبارة الاستخدام على أداة صيد، بل تحتوي فقط على أداة نهائية وبالتالي تتخلص من المورد نيابةً عنك.إذا كانت عبارة الاستخدام تلتقط كافة الاستثناءات وتستمر في التشغيل، فسيكون ذلك عائقًا كبيرًا أمام تصحيح الأخطاء.
إنه ببساطة أسهل وأسرع في الاستخدام والقراءة
انظر بنفسك
var myVar = null
try
{
my = new Object();
//Do stuff
}
finally
{
if(myVar != null)
myVar.Dispose()
}
ضد
using(var myVar = new Object())
{
//Do stuff
}
إنه ببساطة للتأكد من تخلص يتم استدعاؤه على هذا الكائن.ال استخدام لا تقم بأي معالجة للاستثناءات لأن المحاولة/الأخيرة لا تفعل ذلك أيضًا