我有以下代码
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 被处置时,由于构造函数的最后一个参数 (leaveOpen=true),它使底层 Stream (ms) 保持打开状态。
如果我稍微更改我的代码..删除 MemoryStream 周围的“using” block 并将“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.
我赢不了..(除非我遗漏了一些明显的东西)我尝试了各种方法,比如在 block 周围放置一个 try/finally,并在那里处理 MemoryStream,但它要么说我我要处理它两次,或者根本不处理!!
最佳答案
除了处理问题,您的代码也有问题。在回读数据之前,您应该关闭 zip 流。
此外,MemoryStream
上已经有一个ToArray()
方法,无需自己实现。
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream gz = new GZipStream(ms, CompressionMode.Compress,true))
{
gz.Write(CompressMe, 0, CompressMe.Length);
}
return ms.ToArray();
}
我只想取消警告,因为它是误报。代码分析是为您服务的,而不是相反。
关于c# - 此代码的正确 IDisposable 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8182598/