c# - 处置对象多次错误。 CA2202。有没有更好的办法?

标签 c# dispose

如何确保以下代码以更好的方式处理所有对象?目前,代码分析告诉我

错误 45 CA2202:Microsoft.Usage:可以在方法“CPCommunicator.GetResults(string)”中多次释放对象“ns”。为避免生成 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,它们都对ns进行了处理,所以为了满足代码分析警告,我不得不注释掉finally block 中的最后两个close方法。但我真的要这样做吗?????

最佳答案

是的,恕我直言,你真的应该只调用一次。

或者,您可以在 ns 上使用 using 语法,这会使整个情况更加清晰。

using (ns = new NetworkStream(CreateConnection(), true)) {
   ...
}

关于c# - 处置对象多次错误。 CA2202。有没有更好的办法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2803314/

相关文章:

c# - 如何从列表中填充数据网格?

c# - 如何在 C# 中的 Dispose() 方法中处理托管资源?

c# - 为什么代码分析器建议处理 IDisposable 字段?

c# - RadioButtonList.SelectedIndex 与 RadioButtonList.SelectedValue

c# - 如何在 azure 上为 asp 创建 SQL 服务器?

java - 处理一个类加载器

powershell - 我/我需要如何处置自定义PSObject?

java 。在 dispose(); 之后,可能的语句如何工作?

c# - 映射的网络驱动器,File.Exists 奇怪的行为

c# - 仅在轴标签中显示整数?