CA2213: Pola usuwalne powinny zostać usunięte
TypeName |
DisposableFieldsShouldBeDisposed |
CheckId |
CA2213 |
Kategoria |
Microsoft.Usage |
Złamanie zmiany |
Bez podziału |
Przyczyna
Typ, który implementuje IDisposable deklaruje pola, które są typów, które także implementują IDisposable.Dispose Metoda pola nie jest wywoływana Dispose metoda typ deklarujący.
Opis reguły
Typ jest odpowiedzialny za usuwania wszystkich jego niezarządzanych zasobów; Można to osiągnąć poprzez wdrożenie IDisposable.Ta reguła sprawdza, czy typ jednorazowe T deklaruje pole F oznacza to wystąpienie typu jednorazowe FT.Dla każdego pola F, reguła próbuje zlokalizować wywołanie do FT.Dispose.Reguła przeszukuje metody wywoływane przez T.Disposei jeden poziom niżej (metody o nazwie metodami wywołana przez FT.Dispose).
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, wywołać Dispose pól, które są typów, które implementują IDisposable Jeśli użytkownik jest odpowiedzialny za przydzielanie i zwalnianie zasobów niezarządzanego posiadanych przez pole.
Kiedy do pomijania ostrzeżenia
Można bezpiecznie pomija ostrzeżenia od tej reguły, jeśli nie jesteś odpowiedzialny dla zwalniania zasób posiadanych przez pole lub jeśli wywołanie Dispose występuje na poziomie wywołującego głębiej niż kontrole reguły.
Przykład
W poniższym przykładzie pokazano typu TypeA który implementuje IDisposable (FT w dyskusji 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);
}
}
}
W poniższym przykładzie pokazano typu TypeB , narusza reguły oświadczając, pole aFieldOfADisposableType (F w poprzednim podrozdziale) jako typ jednorazowe (TypeA) i nie wywołują Dispose na polu.TypeBodpowiada T w poprzednim podrozdziale.
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);
}
}
}