Sdílet prostřednictvím


CA2202: Neuvolňujte objekty několikrát

Název_typu

DoNotDisposeObjectsMultipleTimes

CheckId

CA2202

Kategorie

Microsoft.Usage

Změnit rozdělení

Bez rozdělení

Příčina

Implementace metody obsahuje cesty kódu, které by mohly způsobit více volání na IDisposable.Dispose nebo ekvivalentní Dispose, jako je například metoda Close() na některé typy na stejný objekt.

Popis pravidla

A správně implementován Dispose metodu lze volat vícekrát bez došlo k výjimce.Však to není zaručeno a vyhnout se vytváření ObjectDisposedException nelze volat Dispose více času na objekt.

Souvisejících pravidel

CA2000: Uvolňujte objekty před ztrátou oboru

Jak opravit porušení

Oprava porušení tohoto pravidla, měnit bez ohledu na to že to provádění cesty kódu Dispose se nazývá pouze jednou pro objekt.

Při potlačení upozornění

Nepotlačovat upozornění od tohoto pravidla.I když Dispose pro objekt známý bezpečně callable vícekrát, provedení může v budoucnu změnit.

Příklad

Vnořené using příkazy (Using v jazyce Visual Basic) může způsobit narušení CA2202 upozornění.Pokud prostředek IDisposable vnitřní vnořené using výpis obsahuje zdroje vnější using prohlášení, Dispose metoda vnořené prostředku uvolní uzavřeného zdroje.Když nastane tato situace, Dispose metoda vnější using prohlášení pokusí vyřazení jeho prostředků druhé.

V následujícím příkladu Stream objektu, která je vytvořena ve vnější pomocí příkazu je vydána na konci vnitřní pomocí příkazu v metody Dispose StreamWriter objekt, který obsahuje stream objektu.Na konci vnější using prohlášení, stream podruhé uvolnění objektu.Druhé vydání je narušení CA2202.

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        // Use the writer object...
    }
}

Chcete-li tento problém vyřešit, použijte try/finally bloku namísto vnější using prohlášení.V finally blokovat, ujistěte se, že stream prostředku není 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();
}

Viz také

Referenční dokumentace

IDisposable

Další zdroje

Implementing Finalize and Dispose