gpt4 book ai didi

c# - 此代码的正确 IDisposable 实现

转载 作者:可可西里 更新时间:2023-11-01 08:43:49 24 4
gpt4 key购买 nike

我有以下代码

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com