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