У меня есть следующий код
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 является Disposed, он оставляет открытый поток (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.
Я не могу выиграть.. (если я не пропущу что-то очевидное) Я пробовал разные вещи, например, положить попытку/наконец вокруг блока и избавиться от MemoryStream там, но он либо говорит, что я "Я распоряжаюсь им дважды, или совсем нет!"