【问题标题】:Advise on code analysis, disposing more than once对代码分析提出建议,多次处理
【发布时间】:2020-07-16 23:18:22
【问题描述】:

我只是想向比我更有经验的人寻求一些建议(不会很难)。

以下代码...

        XmlSerializer serializer = new XmlSerializer(typeof(Installation));
        using (var sw = new StringWriter()) {
            using (var xw = XmlWriter.Create(sw)) {
                serializer.Serialize(xw, Installation);
            }
            xmlResult = sw.ToString();
        }

在代码分析中有如下报告...

CA2202 不要多次处理对象对象“sw”可以是 在方法中多次处理 'Views_Commissioning_installationSubsidyForm.SaveInstall(string)'。至 避免生成不应调用的 System.ObjectDisposedException 对一个对象进行多次处理。: 行: 766 nc1_DealerPortal 安装SubsidyForm.aspx.cs 766

谁能解释我如何多次处理“sw”?我在这里做错了什么?

【问题讨论】:

标签: c# .net code-analysis


【解决方案1】:

StringWriter 将由XmlWriter 处理,因此通过使用 2 个 using 语句,它将被处理两次,更改您的代码如下:

XmlSerializer serializer = new XmlSerializer(typeof(Installation));
var sw = new StringWriter()) 
using (var xw = XmlWriter.Create(sw)) 
{
    serializer.Serialize(xw, Installation);
    xmlResult = sw.ToString();
}

【讨论】:

  • 为什么它会被 XmlWriter 处理掉?只是对我自己的一些澄清。 (可能是因为那个 sw 是用来创建 XmlWriter 对象的?)
  • 那么,如果我将一个对象与另一个在 using 语句中实例化的对象一起使用,那么第一个对象也会被释放?
  • 如果XmlWriter.Create() 失败,sw 不会被释放。代码分析也应该抱怨这一点。
  • 在@BenRobinson 发布的代码中,xw 总是被释放——但sw 不一定,因为它不在任何using 块中。这段代码可能根本不处理,而不是两次处理(当然,对于StringWriter,这没有实际意义)。
  • @Stuart:不,不一定。 .NET 和其他库中有一些对象拥有您给它们的一次性对象的所有权。但不能保证这一点。您需要单独检查每个案例。
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2014-07-09
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多