CA2213: Disposable fields should be disposed

TypeName

DisposableFieldsShouldBeDisposed

CheckId

ca2213

Category

Microsoft.Usage

تعطيل تغيير

غير فاصلة

السبب

نوع تطبيق System.IDisposableيقوم بتعريف حقول التي تكون من الأنواع التي تطبق أيضا IDisposable. Disposeأسلوب الحقل هو لا تسمى Disposeالأسلوب للنوع المعرف.

وصف القاعدة

مسؤولة عن ترتيبها من الجميع موارد غير مدار نوعا؛ ويتم إنجاز ذلك بواسطة تطبيق IDisposable. Th هو قاعدة التحقق لمعرفة ما إذا كان على dهوposable نوع Tيقوم بتعريف حقل Fالتي هو مثيل من النوع dهوposable FT. لكل حقل F، قاعدة يحاول بحث يتصل إلى FT.Dispose. قاعدة يبحث عن الأساليب التي يتم استدعاؤها بواسطة T.Dispose، و المستوى واحد أدنى (الأساليب التي يتم استدعاؤها بواسطة الأساليب التي يتم استدعاؤها بواسطة FT.Dispose).

كيف إلى الإصلاح انتهاكات

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

عند إلى منع التحذيرات

هو الأمن لمنع ظهور تحذير من القيم بالموضع هو قاعدة إذا لم تكن مسؤولاً لتحرير الموارد يتضمنها الحقل أو استدعاء Disposeتحدث على المستوى أعمق استدعاء من اختبارات قاعدة.

مثال

يلي مثال يظهر نوع TypeAالذي يطبق IDisposable(FTفي the previosu مناقشة).

using System;  

namespace UsageLibrary
{
    public class  TypeA :IDisposable
    {

        protected virtual void Dispose(bool disposing) 
        {
            if (disposing) 
            {
                // Dispose managed resources
            }

            // Free native resources
        }

        public void Dispose()
        {

                Dispose(true);

                GC.SuppressFinalize(this);

        }

        // Disposable types implement a finalizer.
        ~TypeA()
        {
            Dispose(false);
        }
    }
}

يظهر المثال التالي نوع TypeBالتي تخالف هذه قاعدة بحقل المعرف aFieldOfADisposableType(Fفي the السابق مناقشة) كنوع disposable ( TypeA) و لم يتم استدعاء Disposeتشغيل الحقل. TypeBيتوافق مع إلىTفي المناقشة السابقة.

using System;  

namespace UsageLibrary
{
   public class  TypeB : IDisposable
   {
      // Assume this type has some unmanaged resources.
      TypeA aFieldOfADisposableType = new TypeA();
      private bool disposed = false;

      protected virtual void Dispose(bool disposing) 
      {
         if (!disposed) 
         {
            // Dispose of resources held by this instance.

            // Violates rule: DisposableFieldsShouldBeDisposed.
            // Should call aFieldOfADisposableType.Dispose();

            disposed = true;
             // Suppress finalization of this disposed instance.
             if (disposing)
             {
                 GC.SuppressFinalize(this);
             }
         }
      }

      public void Dispose()
      {
         if (!disposed)
         {
            // Dispose of resources held by this instance.
            Dispose(true);
         }
      }

      // Disposable types implement a finalizer.
      ~TypeB()
      {
         Dispose(false);
      }
   }
}

راجع أيضًا:

المرجع

تطبيق إنهاء و التخلص إلى تنظيف لأعلى موارد غير المُدارة

System.IDisposable