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条件运算符时会标记我?
因为您在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();
}