满足代码使用MemoryStream和CryptoStream分析处理规则

时间:2014-12-16 20:58:38

标签: c# memory dispose

我遇到了满足代码分析规则的问题,用于处理MemoryStream对象。

这是我现在的代码:

byte[] bytes;
MemoryStream stream = new MemoryStream();

using (CryptoStream cs = new CryptoStream(stream, transform, CryptoStreamMode.Write))
{
    cs.Write(buffer, 0, buffer.Length);
}

bytes = stream.ToArray();
stream.Close();

return bytes;

这会导致警告流可能两次,或者可能会被处置(每个都有一个警告)。

我也尝试将其包装到using(MemoryStream stream = new MemoryStream())块中。这导致了前一个警告。

最后,删除对Close()Dispose()的来电会导致后一个警告。

有没有办法满足这两个条件?我认为问题是一个可以关闭它的异常路径,但我不太熟悉这些类的工作方式。

3 个答案:

答案 0 :(得分:2)

您可以使用

删除所有流
var bytes = transform.TransformFinalBlock(buffer, 0, buffer.Length);

如果没有流,你不必担心处理它们;)

答案 1 :(得分:1)

我个人倾向于在我的源代码中禁止该规则,因为大多数对象都没有被丢弃的问题。但是如果你想在不压制的情况下满足规则,你需要这样做:

        byte[] bytes = new byte[1024];
        byte[] buffer = new byte[1024];
        ICryptoTransform transform = null;

        MemoryStream stream = null;

        try
        {
            stream = new MemoryStream();
            MemoryStream tempStream = stream

            using (CryptoStream cs = new CryptoStream(stream, transform, CryptoStreamMode.Write))
            {
                // set stream to null immediately so it doesn't get disposed by finally
                stream = null;

                cs.Write(buffer, 0, buffer.Length);
                bytes = tempStream.ToArray();
            }
        }
        finally
        {
            if (stream != null)
            {
                stream.Dispose();
            }
        }

        return bytes;

答案 2 :(得分:0)

当处置CryptoStream时(using阻止结束时),它会调用Close上的MemoryStream,该Dispose会调用Dispose

因此,您不需要自己致电using(通过Close)或stream。这样,MemoryStream stream = new MemoryStream(); using (CryptoStream cs = new CryptoStream(stream, transform, CryptoStreamMode.Write)) { cs.Write(buffer, 0, buffer.Length); return stream.ToArray(); } 只会被处置一次。

{{1}}