【发布时间】:2014-07-11 03:05:27
【问题描述】:
我在以下代码中收到警告 CA2202(对象可以多次处理):
using (Stream responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var br = new BinaryReader(responseStream))
{
responseValue = br.ReadBytes(500000);
}
}
似乎在调用 BinaryReaders Dispose 时调用了 responseStreams Dispose。 BinaryReader 是否总是调用 Streams Dispose 方法?
一种解决方案是直接初始化 ResponseStream 并让 BinaryReader 负责处理流(当然,只有在 BinaryReader 会在任何情况下处理流时才会起作用)
Stream responseStream = response.GetResponseStream();
if(responseStream != null)
using (var br = new BinaryReader(responseStream)) //Always disposes the response stream?
[...]
我可以使用 try/finalize 而不是外部 using 语句来获得类似这样的结果:
Stream responseStream = null;
try
{
responseStream = response.GetResponseStream();
if (responseStream != null)
using (var br = new BinaryReader(responseStream))
{
responseValue = br.ReadBytes(500000);
}
}
finally
{
if(stream != null)
stream.Dispose;
}
当 BinaryReader 总是处理流时,这看起来不太好而且没有必要。是否有更好/首选的解决方案来解决此类问题?
【问题讨论】:
-
Gaurav 有下面的答案,但我只想指出according to Microsoft's own documentation for
IDisposable.Dispose(),"如果一个对象的 Dispose 方法被多次调用,该对象必须忽略第一次之后的所有调用一个。 - 这意味着这应该是一个非问题(除了你可能已经将它放在一个地方然后继续尝试使用它的事实,这是一个不同的问题) .