今天早些时候,我在工作中对一些代码运行代码分析时遇到了CA1063。
我有两个问题:
使用系统;使用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(“结束”);}
发布于 2013-03-11 21:06:52
最初,Microsoft预期许多类型的对象将同时封装托管资源和非托管资源,而且即使特定的可继承类没有封装任何非托管资源,从中派生的类也可能会封装。尽管这种想法在很大程度上是错误的(通常更好的做法是将非托管资源分离到它们自己的对象中,然后这些对象可能被用作托管资源),但设计用于处理任意混合的管理和非管理资源的模式已经成为一个既定的先例。
即使完整处理模式的某些部分是愚蠢的,适当的简化也不会遗漏很多。清理代码应该在受保护的虚拟方法中,以便允许派生类添加它们自己的逻辑,但仍然链接到父类方法;如果该方法被赋予名称Dispose,则它必须具有不同于无参数Dispose方法的签名,尽管我自己的首选项是一个具有不同名称的无参数方法。我对微软的模式最大的不满是,它要求每个派生类都有自己的逻辑来防止重复处理;让基类在非虚拟Dispose实现中处理这个问题会更干净。
https://stackoverflow.com/questions/15346952
复制相似问题