ca2000: التخلص الكائنات قبل فقدان نطاق
TypeName |
DisposeObjectsBeforeLosingScope |
CheckId |
ca2000 |
Category |
Microsoft.وثوقية |
تعطيل تغيير |
غير فاصلة |
السبب
كائن محلي من IDisposableنوع هو التي تم إنشاؤها ولكن الكائن هو لا dهوposed قبل أن تكون الجميع المراجع إلى الكائن خارج نطاق.
وصف القاعدة
التخلص إذا كائن disposable هو عدم وضوح من قبل الجميع المراجع إلى تكون خارج نطاق، وسوف يتم التخلص من الكائن في بعض الوقت غير معرفة متى collecإلىr البيانات المهملة تشغيل أداة الإنهاء الكائن. لأنه قد يحدث حدث الاستثنائية التي تمنع أداة الإنهاء كائن من التشغيل، والكائن يجب أن يكون وضوح التخلص بدلاً من ذلك.
كيف إلى الإصلاح انتهاكات
إلى إصلاح انتهاكا لهذه قاعدة، قم باستدعاء Disposeتشغيل الكائن قبل الجميع المراجع إلى تصبح خارج نطاق.
لاحظ أنه يمكنك استخدام usingعبارة ( Usingفي Visual أساسى) إلى كائنات الالتفاف لتنفيذ تلك IDisposable. يتم التخلص الكائنات الملتفة بهذه الطريقة تلقائياً عند الإغلاق في usingحظر.
الحالات التالية هي بعض الحالات الموقع استخدام جملة هو لا يكفي لحماية الكائنات IDهوposable وقد يؤدي CA2000 الانطلاق.
إرجاع كائن dهوposable يتطلب الكائن هو بناء في حظر محاوله/اخيرا خارج استخدام حظر.
تهيئة الأعضاء كائن disposable يجب أن لا يتم إنجازه في الدالة الإنشائية يستخدم عبارة.
تداخل المنشئات المحمية فقط بواسطة معالج استثناء. على سبيل المثال،
using StreamReader sr = new StreamReader(new FileStream("C:\myfile.txt", FileMode.Create)) { ... }
يؤدي CA2000 الانطلاق بسبب فشل إنشاء الكائن StreamReader يؤدي إلى كائن يقوم FileStream لم يتم مغلق.
يجب استخدام الكائنات ديناميكي كائن ظل إلى تطبيق نمط تخلص من كائنات IDisposable.
عند إلى منع التحذيرات
لا تقوم بمنع تحذير من هذه قاعدة، إلا إذا تم استدعاء أسلوب تشغيل جهاز كائن يستدعي Dispose، مثلClose.
القواعد ذات الصلة
CA2213: Disposable fields should be disposed
ca2202: لا التخلص الكائنات عدة مرة/مرات
مثال
إذا تم تنفيذ أسلوب إرجاع كائن dهوposable، باستخدام حظر محاوله/اخيرا دون حظر catch للتأكد من أن الكائن هو dهوposed. باستخدام حظر محاوله/اخيرا، يمكنك السماح باستثناءات raهوed عند يؤشر الخطأ والتأكد من ذلك الكائن هو dهوposed.
في أسلوب OpenPort1، المكالمة إلى فتح الاتصال يمكن أن تفشل إلى SomeMethod أو الكائن ISerializable مَنفذ تسلسلي. تشغيل CA2000 على هذا التطبيق.
يتم تعريف كائنين مَنفذ تسلسلي في أسلوب OpenPort2، و التعيين إلى قيمة فارغة:
tempPort، أي هو المستخدمة لاختبار نجاح العمليات الأسلوب.
port، أي هو استخدامها لقيمة الإرجاع للأسلوب.
tempPortهو بناء وفتحه في tryوكتل المطلوبة الأخرى تعمل هو تنفيذ في نفس tryحظر. في النهاية tryحظر منفذ مفتوح هو المعينة portالكائن الذي سيتم إرجاع و tempPortالكائن هو تعيين إلى null.
finallyحظر بفحص القيمة tempPort. إذا كانت قيمة غير خالية، في عملية أسلوب فشل، و tempPortمغلق للتأكد من أن يتم إصدار أية موارد. سوف تحتوي على الكائن الذي تم إرجاعه من منفذ الكائن مَنفذ تسلسلي المفتوحة إذا نجحت العمليات الأسلوب، أو يكون فارغاً في حالة فشل عملية.
Public Function CreateReader1(ByVal x As Integer) As StreamReader
Dim local As New StreamReader("C:\Temp.txt")
x += 1
Return local
End Function
Public Function CreateReader2(ByVal x As Integer) As StreamReader
Dim local As StreamReader = Nothing
Dim localTemp As StreamReader = Nothing
Try
localTemp = New StreamReader("C:\Temp.txt")
x += 1
local = localTemp
localTemp = Nothing
Finally
If (Not (localTemp Is Nothing)) Then
localTemp.Dispose()
End If
End Try
Return local
End Function
public SerialPort OpenPort1(string portName)
{
SerialPort port = new SerialPort(portName);
port.Open(); //CA2000 fires because this might throw
SomeMethod(); //Other method operations can fail
return port;
}
public SerialPort OpenPort2(string portName)
{
SerialPort tempPort = null;
SerialPort port = null;
try
{
tempPort = new SerialPort(portName);
tempPort.Open();
SomeMethod();
//Add any other methods above this line
port = tempPort;
tempPort = null;
}
finally
{
if (tempPort != null)
{
tempPort.Close();
}
}
return port;
}
لأن المترجم Vهوual الأساسية الافتراضية لجعل الجميع عوامل تشغيل الحسابية البحث عن منطقة تجاوز السعة، هناك هو فرصة أي عملية حسابية VB أن يقوم بطرح OverflowException. يمكن أن يؤدي هذا إلى انتهاكات غير متوقع في قواعد مثل كـ CA2000. على سبيل المثال، سيقوم على دالة CreateReader1 التالية إنتاج انتهاك CA2000 لأن المحول البرمجي VB هو باعث حدث تجاوز يتم الآن التدقيق من الإرشادات لإضافة الذي يقوم بقد طرح استثناء الذي يؤدي StreamReader لا يكون dهوposed.
إلى حل هذه المشكلة، يمكنك يعطل باعث لتجاوز اختبارات بالمترجم VB في مشروع الخاص بك أو يمكنك تعديل تعليمات برمجية مثل دالة CreateReader2 التالية.
إلى تعطيل باعث تدقيق تجاوز السعة، انقر نقراً مزدوجاً فوق اسم مشروع في "مستكشف الحل" وثم انقر فوق خصائص. انقر فوق ترجمة، انقر فوق خيارات ترجمة متقدمة، ثم فحص إزالة s فحص تجاوز العدد الصحيح.