У меня есть следующий код
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.
Насколько я знаю: m, когда GZipStream Disposed, он оставляет базовый Stream (ms) открытым из-за последнего параметра конструктора (leaveOpen = true).
Если я немного изменю свой код ... удалите блок 'using' вокруг MemoryStream и измените параметр '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;
}
}
Затем возникает ...
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, но в нем либо написано, что я избавляюсь от него дважды, либо нет вообще !!