У меня есть следующий код
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;
}
}
}
Это работает нормально, но когда я запускаю анализ кода на нем, появляется следующее сообщение
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.
Насколько мне известно, когда GZipStream установлен, он оставляет основной поток (мс) открытым из-за последнего параметра конструктора (оставьте открытым = true).
Если я немного изменю свой код .. удалите блок 'using' вокруг MemoryStream и измените параметр 'leftOpen' на 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;
}
}
Затем получается ...
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.
Я не могу победить .. (если я не пропустил что-то очевидное) Я пробовал разные вещи, такие как установка try / finally вокруг блока и удаление там MemoryStream, но это либо говорит, что я Я избавляюсь от этого дважды, или нет вообще !!