CA2202: Nie należy usuwać obiektów wiele razy
TypeName |
DoNotDisposeObjectsMultipleTimes |
CheckId |
CA2202 |
Kategoria |
Microsoft.Usage |
Złamanie zmiany |
Bez podziału |
Przyczyna
Implementacja metody zawiera ścieżki kodu, które może spowodować, że wiele wywołań do IDisposable.Dispose lub równoważne zbycia, takie jak metoda się na niektórych typów, dla tego samego obiektu.
Opis reguły
Poprawnie wdrożone a Dispose metoda może być wywołana wiele razy bez zgłaszanie wyjątku.Jednak to nie jest gwarantowane i aby uniknąć generowania ObjectDisposedException nie należy wywoływać Dispose więcej niż jeden raz na obiekcie.
Zasady pokrewne
CA2000: Usuwanie obiektów przed utratą zakresu
Jak naprawić naruszenia
Aby rozwiązać naruszenie tej zasady, zmień implementację tak, że niezależnie od ścieżki kodu Dispose jest wywoływana tylko jeden raz dla tego obiektu.
Kiedy do pomijania ostrzeżenia
Nie pomijaj ostrzeżenie od tej reguły.Nawet jeśli Dispose dla obiektu jest znany być bezpiecznie wpłacone wiele razy, wykonania mogą ulec zmianie w przyszłości.
Przykład
Zagnieżdżone using instrukcji (Using w języku Visual Basic) może spowodować naruszenie ostrzeżenie CA2202.Jeśli zasób IDisposable wewnętrznej, zagnieżdżonej using instrukcja zawiera zasobu zewnętrznego using instrukcji, Dispose metoda zagnieżdżonych zasobu zwalnia zasobów zawarte.Gdy taka sytuacja wystąpi, Dispose metoda zewnętrznego using instrukcji próbuje zbycia swoich zasobów po raz drugi.
W poniższym przykładzie Stream obiekt, który jest tworzony w zewnętrzny za pomocą instrukcji jest wydana na końcu wewnętrznej w metodzie zbycia za pomocą instrukcji StreamWriter obiekt, który zawiera stream obiektu.Na końcu zewnętrznego using instrukcji, stream jest zwalniany po raz drugi obiekt.Drugie wydanie jest naruszenie CA2202.
using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
using (StreamWriter writer = new StreamWriter(stream))
{
// Use the writer object...
}
}
Aby rozwiązać ten problem, należy użyć try/finally bloku zamiast zewnętrznego using instrukcji.W finally bloku, upewnij się, że stream zasób nie jest null.
Stream stream = null;
try
{
stream = new FileStream("file.txt", FileMode.OpenOrCreate);
using (StreamWriter writer = new StreamWriter(stream))
{
stream = null;
// Use the writer object...
}
}
finally
{
if(stream != null)
stream.Dispose();
}