我遇到了满足代码分析规则的问题,用于处理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()
的来电会导致后一个警告。
有没有办法满足这两个条件?我认为问题是一个可以关闭它的异常路径,但我不太熟悉这些类的工作方式。
答案 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}}