FXCop:“拥有一次性字段的类型应该是一次性的”

Posted

技术标签:

【中文标题】FXCop:“拥有一次性字段的类型应该是一次性的”【英文标题】:FXCop: "Types that own disposable fields should be disposable" 【发布时间】:2009-05-29 16:20:58 【问题描述】:

我开始对我的一些程序集使用 FXCop,并注意到一些有趣的东西,我正试图绕开我的脑袋。

"声明一次性成员的类型 还应该实现 IDisposable。如果 该类型不拥有任何非托管 资源,不要实施 终结器。”

我有自己的类,其中包含一些从 System.Web.UI.WebControls.Button 继承的控件。它不是抱怨我继承的按钮,而是包装它们的类。

这里有什么影响或危险?

【问题讨论】:

【参考方案1】:

如果您的类包含 IDisposable 类型,但您的类不是 IDisposable,那么当不再需要您的类的实例时,您的类中的 IDisposable 类型可能没有按时释放/释放。 Dispoble 类型应该在您不再需要它们时立即释放,以便释放资源。如果不这样做,则必须等到 GC 启动,然后资源也将被释放。

【讨论】:

【参考方案2】:

如您所知,当您使用完一次性对象后,您应该调用它的Dispose 方法。

当您从这些控件继承时,仍然可以调用Dispose 方法。但是如果你做了一个包装器,那么你的包装器类的用户应该能够调用Dispose

public void Dispose() 
    button.Dispose();
    // any other thing that is disposable

【讨论】:

【参考方案3】:

包含按钮的类的性质是什么?

通常我只希望作为复合控件的类具有其他控件作为成员。这样的类通常会直接或间接从 System.Web.UI.CompositeControl 或 System.Web.UI.WebControl 继承,并且您作为成员拥有的控件应添加到 Controls 集合中。

这样做将确保它们被正确处理,并且应该消除 FxCop 警告。

如果这没有帮助,请发布有关课程的更多详细信息。

【讨论】:

以上是关于FXCop:“拥有一次性字段的类型应该是一次性的”的主要内容,如果未能解决你的问题,请参考以下文章

将自定义 Fxcop 规则与现有 Fxcop 规则集成

忽略某些特定情况的内置 FxCop 规则。自定义 FxCop 规则?

Fxcop 自定义规则未显示在 Fxcop GUI 中

Fxcop 错误,返回代码为“2048”

如何在 VS2010 Professional 中配置 FxCop 规则并使用 FxCop Runner 运行它

FxCop 安装