【发布时间】:2016-04-10 08:59:55
【问题描述】:
具备以下条件:
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()?
【问题讨论】:
-
是否有任何理由执行手动处理,而不仅仅是使用
using语句? -
其实警告是正确的。
StringWriter被释放两次,因为XmlTextWriter.Dispose()将释放它。 -
@Henrik:但这并不能解释为什么行为会发生变化。如果您不明确 Dispose,我希望会触发警告,因为
XmlTextWriter的行为是其实现的附带行为。 -
我正在手动处理以避免
StringWriter被处理两次。如果XmlTextWriter释放了StringWriter,那么null 条件应该确保它不会被再次释放。 -
如果您查看警告的解决方案:msdn.microsoft.com/library/ms182334.aspx 您会发现问题不在于代码结构,而只是我使用的是 null 条件而不是 @ 987654335@ 块。对吗?
标签: c# static-analysis try-catch-finally ca2202 null-conditional-operator