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 规则?