fxcop 分析在foreach
行上为以下方法主体发出CA2202警告:
public void LogAnalysis(IEnumerable<string> steps, bool append = false)
{
if (steps != null)
{
StringBuilder sb = new StringBuilder();
try
{
foreach (string step in steps) // this is line 34
{
sb.AppendLine(step);
}
if (append)
{
sb.Insert(0, string.Format(
CultureInfo.InvariantCulture,
"__________Logging started at {0}__________n",
DateTime.Now.ToString(CultureInfo.InvariantCulture)));
File.AppendAllText(AnalysisLogFile, sb.ToString());
}
else
{
File.WriteAllText(AnalysisLogFile, sb.ToString());
}
}
catch (Exception e) when (e is IOException || e is UnauthorizedAccessException)
{
LogError(e.Message);
}
sb.Clear();
}
}
警告 CA2202 对象"步骤。GetEnumerator((' 可以释放更多 比一次在方法'LoggingService.LogAnalysis(IEnumerable, 布尔('。要避免生成 System.ObjectDisposedException ,您 不应在一个对象上多次调用"释放"。: 行数:34
我做了一些研究,发现嵌套的using
语句和Dispose
调用会导致分析器发疯并发出此警告,但我既没有明确的Dispose
调用,也没有using
块。我没有遇到过此警告在foreach
循环中弹出的情况。我知道如何抑制警告,但我只是想了解这可能是什么原因?
根据 canton7 的评论,我意识到当您使用菜单 Analyze>Run Code Analysis(分析运行代码分析(强制使用代码分析时,即使您安装了新的 Roslyn Nuget 包,它也会强制使用旧的二进制 fxcop。新的分析器在构建时自动使用,当我使用新的分析器时,问题中提到的警告已经消失。