Udostępnij za pośrednictwem


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

Zobacz też

Informacje

IDisposable

Inne zasoby

Implementing Finalize and Dispose