ho il seguente codiceCorretta attuazione IDisposable per questo codice
public static byte[] Compress(byte[] CompressMe)
{
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream gz = new GZipStream(ms, CompressionMode.Compress,true))
{
gz.Write(CompressMe, 0, CompressMe.Length);
ms.Position = 0;
byte[] Result = new byte[ms.Length];
ms.Read(Result, 0, (int)ms.Length);
return Result;
}
}
}
Questo funziona bene, ma quando ho eseguito l'analisi del codice su di esso, si tratta con il seguente messaggio
CA2202 : Microsoft.Usage : Object 'ms' can be disposed more than once in
method 'Compression.Compress(byte[])'. To avoid generating a
System.ObjectDisposedException you should not call Dispose more than one
time on an object.
Per quanto per quanto mi riguarda, quando GZipStream è eliminato, lascia aperto il sottostante Stream (ms), a causa dell'ultimo parametro del costruttore (leaveOpen = true).
Se cambio un po 'il mio codice .. rimuovere il 'usando' blocco intorno al MemoryStream e cambiare il parametro 'leaveOpen' false ..
public static byte[] Compress(byte[] CompressMe)
{
MemoryStream ms = new MemoryStream();
using (GZipStream gz = new GZipStream(ms, CompressionMode.Compress, false))
{
gz.Write(CompressMe, 0, CompressMe.Length);
ms.Position = 0;
byte[] Result = new byte[ms.Length];
ms.Read(Result, 0, (int)ms.Length);
return Result;
}
}
Questo poi esce con ..
CA2000 : Microsoft.Reliability : In method 'Compression.Compress(byte[])',
object 'ms' is not disposed along all exception paths. Call
System.IDisposable.Dispose on object 'ms' before all references to
it are out of scope.
Non riesco a vincere .. (a meno che non mi sfugga qualcosa di ovvio) Ho provato varie cose, come mettere un tentativo/finalmente intorno al blocco, e Smaltimento di MemoryStream lì, ma o dice che io lo smaltisco due volte, o per niente !!
È strano. Da [msdn docs] (http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx): [...] Il metodo di smaltimento [...] dovrebbe essere richiamabile più volte senza generare un'eccezione (ObjectDisposedException). – oleksii
CA2000 è una pita enorme. Nella mia esperienza genera più falsi positivi rispetto agli avvertimenti di genuiune. Tutto ciò che [il lupo che piange] (http://en.wikipedia.org/wiki/The_Boy_Who_Cried_Wolf) ora significa che io tendo a ignorare/sopprimere CA2000 ogni volta che emerge. – LukeH
Non puoi vincere. Correggi il bug nel tuo codice, gz ha bisogno di Flush() o chiuso per produrre tutti i byte. –