拥有以下内容:
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()?
答案 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();
}