c# - 关于处理表单的代码分析警告

标签 c# .net visual-studio-2010 code-analysis

我有几个将表单转换为控件的静态方法(如下所示)。分析器标记两者,声明“CA2000:Microsoft.Reliability:在方法'...'中,对象'form'并未沿着所有异常路径进行处理。在对象'form'上调用System.IDisposable.Dispose,然后再对它进行所有引用超出范围。”类似的标记为 tabPage .

注意:对于那些没有企业版和分析器菜单的人,这看起来很像 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;
  }

  ...
}

最佳答案

CA2000很麻烦,错误警告太多。 FxCop 不够聪明,不知道 Control 类是如何工作的。它的 Dispose() 方法仅在创建 native 控制窗口后才做一些有用的事情。只有这样,才会有可以处置的非托管资源。但是直到您返回的 TabPage 被添加到 TabControl 并且该控件又被添加到表单并调用该表单的 Show() 方法之后才会发生这种情况。我们看不到的代码(也看不到 FxCop)。此外,即使有异常,当 native 窗口被破坏时,它们实际上也会被处理掉。

您可以通过在方法中添加 try/catch 来抑制警告,这样您就可以在 catch block 中调用 Dispose()。但这将是一个错误,它只是添加了不必要的代码,在运行时不会做任何有用的事情。使用 [SuppressMessage] 属性消除警告。

关于c# - 关于处理表单的代码分析警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8795005/

相关文章:

c# - 根据屏幕宽 x 屏幕高查找显示器配置

.net - 单元测试数据访问层

powershell - OpenRemoteBaseKey() 凭据

c - mulcross数据生成器运行错误: free():invalid next size

c++ - 尽管链接了正确的库,但仍解析未解析的外部符号 CSourceSeeking::CSourceSeeking(...)

c# - Xamarin : Segmented Control for windows uwp

c# - 为什么 Entity Framework 会尝试插入现有实体?

c# - update panel的asyncpostbacktrigger可以有两个控件ID吗?

c# - 从未知接口(interface)获取属性

c++ - 通过 Web 服务器远程运行 C++ 程序(Visual Studio 应用程序)