我有以下代码正确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.
就来了我的看法,当GZipStream布置,它留下底层的流(MS)开放,由于构造函数(leaveOpen = TRUE)的最后一个参数。
如果我稍微改变我的代码..去掉周围的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 /终于各地块,并在那里将MemoryStream的处置,但也不说,我处置它两次,或根本不!
这是很奇怪的。从[msdn文档](http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx):[...] Dispose方法应该多次调用而不会抛出异常(ObjectDisposedException )。 – oleksii
CA2000是一个巨大的皮塔饼。根据我的经验,它比genuiune警告产生更多的误报。所有[哭泣的狼](http://en.wikipedia.org/wiki/The_Boy_Who_Cried_Wolf)现在意味着我倾向于忽略/压制CA2000。 – LukeH
你不能赢。在你的代码中修正bug,gz需要Flush()或者关闭以产生所有的字节。 –