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