Правильная реализация IDisposable для этого кода

У меня есть следующий код

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, но в нем либо написано, что я избавляюсь от него дважды, либо нет вообще !!

11
задан Rich S 18 November 2011 в 12:43
поделиться