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

标签 c# .net code-analysis 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 被处置时,由于构造函数的最后一个参数 (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/

相关文章:

c# - NuGet:无法安装包 VVVV.EmguCV 2.4.2.1

code-analysis - 如何防止 Visual Studio 在每次构建后切换到“代码分析”选项卡?

c# - 如何使用 linq 将列数据移动到同一行中的另一列

c# - 如何引用 C# 数组中的值

c# - HTTPOnly 将 cookie 过期时间设置为 session

c++ - 适用于复杂 C++ 项目的动态死代码消除工具

visual-studio - 何时使用 `silent` 代码分析严重性?

c# - 基于 Microsoft Bot Framework 的机器人可以连接到多个 channel 吗?

c# - 你是如何扩展你的断言类的

c# - 如何知道用户是否可以读取和列出目录中的文件