我在以下代码中收到警告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总是处理流时,这看起来不好看,没有必要。是否有更好/首选的解决方案来解决此类问题?
您实际上可以看一下如何BinaryReader.Dispose
实现:
protected virtual void Dispose(bool disposing) {
if (disposing) {
Stream copyOfStream = m_stream;
m_stream = null;
if (copyOfStream != null && !m_leaveOpen)
copyOfStream.Close();
}
m_stream = null;
m_buffer = null;
m_decoder = null;
m_charBytes = null;
m_singleChar = null;
m_charBuffer = null;
}
public void Dispose()
{
Dispose(true);
}
现在,问题是什么m_leaveOpen
?这是一个标志,指示是否应处置基础流!默认情况下设置为false
,这意味着将处理基础流:
public BinaryReader(Stream input) : this(input, new UTF8Encoding(), false) {
}
public BinaryReader(Stream input, Encoding encoding) : this(input, encoding, false) {
}
public BinaryReader(Stream input, Encoding encoding, bool leaveOpen) {
// (...)
m_leaveOpen = leaveOpen;
// (...)
}
因此,您可以跳过using
流周围的语句,因为它仍然会被处理:
responseStream = response.GetResponseStream();
if (responseStream != null)
{
using (var br = new BinaryReader(responseStream))
{
responseValue = br.ReadBytes(500000);
}
}
要不就
using (var br = new BinaryReader(response.GetResponseStream()))
{
responseValue = br.ReadBytes(500000);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句