首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么正确实施IDisposable的复杂方案?

为什么正确实施IDisposable的复杂方案?
EN

Stack Overflow用户
提问于 2013-03-11 19:29:15
回答 1查看 276关注 0票数 3

今天早些时候,我在工作中对一些代码运行代码分析时遇到了CA1063

我有两个问题:

  1. 为什么下面的代码不会导致CA1063,即使它显然违反了某些要求(例如,Dispose被覆盖)
  2. 造成虚拟处置(Bool)的复杂方案(Bool)的代码的实际问题是什么?这个虚拟处置(Bool)是由一个密封Dispose()和终结器调用的,等等.

使用系统;使用System.Collections.Generic;使用System.Linq;使用System.Text;命名空间ConsoleApplication1 {类Foobar : IDisposable { public Foobar() {Console.Out.WriteLine(“Foobar的构造函数”);}公共虚拟空Dispose() { Console.Out.WriteLine("Dispose of Foobar");GC.SuppressFinalize(this);} ~Foobar() {Console.Out.WriteLine(“Foobar的终结器”);}_(_}}类程序{静态void (){ Console.Out.WriteLine("Start");使用(var foo =新派生()){Console.Out.WriteLine(“.”);}Console.Out.WriteLine(“结束”);}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-11 21:06:52

最初,Microsoft预期许多类型的对象将同时封装托管资源和非托管资源,而且即使特定的可继承类没有封装任何非托管资源,从中派生的类也可能会封装。尽管这种想法在很大程度上是错误的(通常更好的做法是将非托管资源分离到它们自己的对象中,然后这些对象可能被用作托管资源),但设计用于处理任意混合的管理和非管理资源的模式已经成为一个既定的先例。

即使完整处理模式的某些部分是愚蠢的,适当的简化也不会遗漏很多。清理代码应该在受保护的虚拟方法中,以便允许派生类添加它们自己的逻辑,但仍然链接到父类方法;如果该方法被赋予名称Dispose,则它必须具有不同于无参数Dispose方法的签名,尽管我自己的首选项是一个具有不同名称的无参数方法。我对微软的模式最大的不满是,它要求每个派生类都有自己的逻辑来防止重复处理;让基类在非虚拟Dispose实现中处理这个问题会更干净。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15346952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档