null条件运算符和CA2202:不要多次处理对象

本文关键字:处理 对象 条件运算符 CA2202 null | 更新日期: 2023-09-27 18:29:12

具有以下特性:

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块中的null条件运算符的一些奇怪之处还是Visual Studio中的分析工具根本不理解它?

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

null条件运算符和CA2202:不要多次处理对象

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

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

警告'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();
}