有关处理表单的代码分析警告

jww*_*jww 1 .net c# code-analysis visual-studio-2010

我有几个静态方法将Form转换为Control(如下所示).分析器标记两者,说明"CA2000:Microsoft.Reliability:In method'...',object'form'不是沿着所有异常路径放置的.在所有对它的引用之前调用System.IDisposable.Dispose on object'form'超出了范围." 类似的标记为tabPage.

注意:对于那些没有Enterprise Edition和Analyzer菜单的用户,这看起来很像FxCop输出.

我不清楚我应该做什么.如果new失败,将抛出异常.我有机会打电话到哪里Dispose

class Foo
{
  static public Form FormAsControl()
  {
    Form form = new Foo();

    form.TopLevel = false;
    form.FormBorderStyle = FormBorderStyle.None;
    form.Dock = DockStyle.Fill;
    form.Visible = true;

    return form;
  }

  static public TabPage FormAsTabPage()
  {
    Form form = Foo.FormAsControl();
    TabPage tabPage = new TabPage();

    tabPage.Text = form.Text;
    tabPage.Controls.Add(form);

    return tabPage;
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 6

CA2000很麻烦,错误警告太多了.FxCop不够聪明,不知道Control类是如何工作的.它的Dispose()方法仅在创建本机控制窗口执行一些有用的操作.只有这样才会有可以处理的非托管资源.但是,直到您返回的TabPage被添加到TabControl并且该控件依次被添加到表单并且调用该表单的Show()方法时才会发生这种情况.我们无法看到的代码(也不是FxCop).此外,他们实际上得到安置,即使有例外,当本机窗口被销毁.

您可以通过向方法添加try/catch来禁止警告,以便可以在catch块中调用Dispose().但这将是一个错误,它只是添加了不必要的代码,在运行时没有做任何有用的事情.使用[SuppressMessage]属性删除警告.