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)
CA2000很麻烦,错误警告太多了.FxCop不够聪明,不知道Control类是如何工作的.它的Dispose()方法仅在创建本机控制窗口后执行一些有用的操作.只有这样才会有可以处理的非托管资源.但是,直到您返回的TabPage被添加到TabControl并且该控件依次被添加到表单并且调用该表单的Show()方法时才会发生这种情况.我们无法看到的代码(也不是FxCop).此外,他们实际上也得到安置,即使有例外,当本机窗口被销毁.
您可以通过向方法添加try/catch来禁止警告,以便可以在catch块中调用Dispose().但这将是一个错误,它只是添加了不必要的代码,在运行时没有做任何有用的事情.使用[SuppressMessage]属性删除警告.