Aracılığıyla paylaş


CA2213: Atılabilen alanlar atılmalıdır

TypeName

DisposableFieldsShouldBeDisposed

CheckId

CA2213

Kategori

Microsoft.Usage

Değişiklik kesiliyor

Olmayan bölme

Neden

Uygulayan bir tür IDisposable da tür alanlarını bildirir IDisposable.Dispose Değil alanın yöntemi çağırıldığında Dispose yöntem tanıtıcısının bildirim türü.

Kural Tanımı

Bir tür, tüm yönetilmeyen kaynakları satarak için sorumludur; Bu uygulama tarafından gerçekleştirilir IDisposable.Bu kural atılabilen bir tür olup olmadığını görmek için denetler T bir alan bildirir F yani atılabilen bir türünde bir örnek FT.Her alan için F, kural için bir çağrı bulmayı dener FT.Dispose.Kural olarak yöntemleri arar T.Disposeve daha düşük bir düzey (arayan yöntemler tarafından çağrılan yöntemlerin FT.Dispose).

İhlalleri düzeltmek nasıl

Bu kuralı ihlal düzeltmek için çağrı Dispose uygulayan tür alanlarda IDisposable tahsis etmek için sorumlu ve yönetilmeyen kaynakları serbest bırakma alanı tarafından tutulan.

Uyarıları ne zaman

Uyarı Bu kuraldan kaynak serbest alanın taşıdığı için sorumlu değilseniz veya bastırmak güvenlidir çağrısı Dispose kuralı çeklerin arama daha derin düzeyde oluşur.

Örnek

Aşağıdaki örnek, bir tür gösterir TypeA , uygulayan IDisposable (FT previosu tartışmasında).

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);
        }
    }
}

Bir türü aşağıdaki örnekte gösterildiği TypeB , ihlal bu kural bir alanı bildirerek aFieldOfADisposableType (F önceki tartışmasında) atılabilen türü (TypeA) ve değil Dispose alanında.TypeBkarşılık gelen T önceki tartışmasında.

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);
      }
   }
}

Ayrıca bkz.

Başvuru

IDisposable

Diğer Kaynaklar

Implementing Finalize and Dispose