1

我查看了 MSDN 文档,并在此代码片段中采用了推荐的模式:

  BitmapSymbols temp = null;
  try {
    using (var source = bitmaps.Symbols) {
      temp = new BitmapSymbols(source, sizeSymbols);
    }
    _bitmapSymbols = temp;
    temp           = null;
  } finally { 
    if (temp!=null) temp.Dispose(); 
  }

有谁知道为什么temp在这种情况下被报道?我看不到任何未处理temp且未设置为“null”的执行路径。提前感谢您的任何帮助。

如果我在 using 中来回移动分配,temp则会从 FxCop 生成相同的警告。

该类BitmapSymbols实现IDisposable, 并且是多个位图集合的包装器,可确保同时释放它们。

更新:
问题提出如下:

无论如何,我不明白你为什么想出这段代码而不是简单地使用:
_bitmapSymbols = new BitmapSymbols(source, sizeSymbols);

原因是如果发生异常,不遵循该模式可能会导致内存泄漏。我正在编写一个游戏,用户可能会运行数小时或数天而无需重新启动,因此避免内存泄漏对于稳定性很重要。

4

2 回答 2

2

即使遵循MSDN 文档中推荐CA2000 Dispose Objects Before Losing Scope的模式,我终于偶然发现了误报的原因(两个不同的案例) :

  1. 如果临时一次性变量的名称不是显示的确切模式,即以camelCase 形式附加到目标一次性变量的字符串“temp”,则会由于无法识别推荐的模式而产生误报。更改名称很容易消除误报。

  2. 如果目标一次性变量是属性而不是字段或本地,则无法识别该模式。消除此处的误报需要编写一个一次性函数,如下所示:

    void SomeMethod() {
      // :  
      HexgridPath   = SetGraphicsPath();
      // :
    }
    
    GraphicsPath SetGraphicsPath() {
      GraphicsPath path     = null;
      GraphicsPath tempPath = null;
      try {
        tempPath  = new GraphicsPath();
        tempPath.AddLines(new Point[] {
          new Point(GridSize.Width*1/3,                0), 
          new Point(GridSize.Width*3/3,                0),
          new Point(GridSize.Width*4/3,GridSize.Height/2),
          new Point(GridSize.Width*3/3,GridSize.Height  ),
          new Point(GridSize.Width*1/3,GridSize.Height  ),
          new Point(                 0,GridSize.Height/2),
          new Point(GridSize.Width*1/3,                0)
        } );
        path     = tempPath;
        tempPath = null;
      } finally { if(tempPath!=null) tempPath.Dispose(); }
      return path;
    }
    

第一种情况看起来像是典型的“初级程序员的第一个作业-刚毕业”的错误;

第二种情况可能更难修复,但很烦人。

希望遇到这些误报的其他人可以从这种分析中受益。从长远来看,小的代码更改比简单地禁用错误要好,以防初级程序员“优化”补救措施。

于 2013-06-21T17:51:25.430 回答
0

我相信删除if (temp != null)将使警告消失。FxCop 不够聪明,无法检查我认为的条件执行路径。

无论如何,我不明白你为什么想出这段代码而不是简单地使用_bitmapSymbols = new BitmapSymbols(source, sizeSymbols);?

于 2013-06-20T01:38:05.983 回答