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

时间:2016-01-06 10:00:12

标签: c# static-analysis try-catch-finally ca2202 null-conditional-operator

拥有以下内容:

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中的分析工具根本不理解它?

编辑:可能相关:Why does Code Analysis flag me when using the null conditional operator with Dispose()?

2 个答案:

答案 0 :(得分:0)

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

编辑: 有关详细信息,请参阅this MSDN文章。

答案 1 :(得分: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();
}