fxcop分析给出了CA2202对foreach行上的以下方法体的警告:
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对象'steps.GetEnumerator()‘可以在方法'LoggingService.LogAnalysis(IEnumerable,bool)’中多次释放。为了避免生成System.ObjectDisposedException,您不应该在对象上调用Dispose超过一次。
我已经做了一些研究,并且看到嵌套的using语句和Dispose调用导致分析器异常并发出警告,但是我没有显式的Dispose调用,也没有using块。我还没有遇到为foreach循环发出此警告的另一种情况。我知道如何压制这一警告,但我只想了解造成这种情况的原因是什么?
发布于 2019-10-08 12:57:31
基于canton7的注释,我意识到当您使用菜单Analyze>Run代码分析强制进行代码分析时,即使您安装了新的Roslyn包,也会强制使用旧的二进制fxcop 。新的分析器在构建时会自动使用,当我使用新的分析器时,问题中提到的警告已经消失了。
https://stackoverflow.com/questions/58285762
复制相似问题