CA2213: Uvolnitelné pole by mělo být uvolněno
Název_typu |
DisposableFieldsShouldBeDisposed |
CheckId |
CA2213 |
Kategorie |
Microsoft.Usage |
Změnit rozdělení |
Bez rozdělení |
Příčina
Typ, který implementuje IDisposable prohlašuje polí, která jsou typy, které také implementovat IDisposable.Dispose Nebyla volána metoda pole Dispose metoda deklarující typ.
Popis pravidla
Typ je zodpovědný za vyřazení všech jeho nespravované prostředky; To lze provést pomocí IDisposable.Toto pravidlo zkontroluje, zda jednorázových typu T prohlašuje pole F je instance jednorázových typu FT.Pro každé pole F, pravidlo se pokusí najít volání FT.Dispose.Pravidlo hledá metody volány T.Disposea nižší úrovni (metody volány metody volány FT.Dispose).
Jak opravit porušení
Porušení tohoto pravidla opravíte volání Dispose na pole, která jsou typy, které implementují IDisposable Pokud zodpovídáte za přidělení a uvolnění nespravované prostředky držení pole.
Při potlačení upozornění
Je bezpečné potlačit varování od tohoto pravidla, pokud není odpovědný za uvolnění prostředků držených pole nebo pokud volání Dispose dojde k volání úroveň hlubší než pravidla kontroly.
Příklad
Následující příklad ukazuje typ TypeA , implementuje IDisposable (FT previosu diskuse).
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);
}
}
}
Následující příklad ukazuje typ TypeB , toto pravidlo porušují prohlášením pole aFieldOfADisposableType (F v předchozí diskusi) jako typ jednorázových (TypeA) a volání není Dispose na poli.TypeBodpovídá T v předchozí diskusi.
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);
}
}
}