如何确保以下代码以更好的方式处理所有对象?目前,代码分析告诉我处理对象多次错误。 CA2202。有没有更好的办法?
错误45 CA2202:Microsoft.Usage:对象'ns'可以在方法'CPCommunicator.GetResults(string)'中多次处理。为了避免产生System.ObjectDisposedException你不应该调用Dispose不止一次对象:线路上:64,65
NetworkStream ns = null;
StreamWriter requestStream = null;
TextReader responseStream = null;
var results = new StringBuilder();
try
{
ns = new NetworkStream(CreateConnection(), true);
requestStream = new StreamWriter(ns);
requestStream.Flush();
responseStream = new StreamReader(ns);
requestStream.Write(reportData);
requestStream.Flush();
while (responseStream.Peek() != -1)
{
var currentLine = responseStream.ReadLine();
results.Append(currentLine);
results.Append("\n");
}
}
finally
{
if (requestStream != null) requestStream.Close();
if (responseStream != null) responseStream.Close();
if (cpNetworkStream != null) cpNetworkStream.Close();
}
由于两个requestStream和responseStream使用NS,他们纳秒的处置都这样以满足代码分析警告,我必须在finally块中注释掉最后两个close方法。但我真的想这样做吗?
虽然推荐,绝对是很好的做法,对于'文档Dispose'指出:“如果一个对象的'Dispose'方法被调用更多对象必须在第一次之后忽略所有的调用,如果它的'Dispose'方法被多次调用,则该对象不能抛出异常。 http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx – LukeH 2010-05-10 14:33:07
@LukeH:由于一个原因,该建议可被认为是“良好实践”:理想情况下,一个对象放置在最后的使用寿命,再次处理它可能意味着甚至导致对其预期寿命和预期寿命的一些混淆。但正如你所说的,正确实现'IDisposable'需要'Dispose'是幂等的。 – cHao 2012-10-30 21:52:06