1

具有以下内容:

StringWriter sw = null;
try
{
    sw = new StringWriter();
    using (var xw = new XmlTextWriter(sw))
    {
        doc.WriteTo(xw);
        return sw.ToString();
    }
}
finally 
{
    sw?.Dispose();
}

在 Visual Studio 2015 中触发CA2202(不要多次处理对象)警告。

但是,如果将fianlly块更改为:

finally 
{
    if (sw != null)
    {
        sw.Dispose();
    }
}

这是块中空条件运算符的一些奇怪之处finally还是什么,或者Visual Studio中的分析工具根本不理解它?

编辑:可能相关:为什么在使用带有 Dispose() 的空条件运算符时代码分析会标记我?

4

2 回答 2

0

因为您在 using 块中声明了 xw,所以当您退出 using 块时,将调用 XmlTextWriter 的 IDisposable 方法。由于您的字符串编写器仅与 XMLWriter 一起使用,它也将由垃圾收集器处理(这是一种优化,可以使 GC 不必依赖引用计数来确定对象是否仍在使用中)。

编辑:可以在这篇MSDN 文章中找到更多信息。

于 2016-01-07T14:31:24.050 回答
0

警告“CA2202”是正确的。

如果创建了“xw”,则应在“xw”中删除“sw”,如果“xw”失败,则应手动删除。

所以你在创建'xw'之后需要'sw = null'。

StringWriter sw = null;
try
{
    sw = new StringWriter();
    using (var xw = new XmlTextWriter(sw))
    {
        sw = null; //need to set null
        doc.WriteTo(xw);
        return sw.ToString();
    }
}
finally
{
    sw?.Dispose();
}
于 2019-12-12T09:35:56.633 回答