本地使用的 IDisposable 是不是有 FxCop 规则?
Posted
技术标签:
【中文标题】本地使用的 IDisposable 是不是有 FxCop 规则?【英文标题】:Is there a FxCop rule for local used IDisposable's?本地使用的 IDisposable 是否有 FxCop 规则? 【发布时间】:2010-02-06 20:30:48 【问题描述】:...如果我在局部变量中使用 IDisposable,但不调用 Dispose() 或使用 using() 模式。
public void BadMethod()
var fs = new FileStream("file.txt", FileMode.Create);
fs.WriteByte(0x55);
// no dispose, no using()
就像字段的 "Types that own disposable fields should be disposable" 规则一样。
编辑: 将 MemoryStream 替换为 FileStream,因为 MemoryStream 只是分配内存而不使用(非托管)资源,因此有人可以讨论强制 Dispose () 调用。
【问题讨论】:
你为什么想要那个?这是没有意义的,内存不是一次性的。希望我们不会得到一个说它是的工具,它会无可挽回地摧毁程序员的思想。 @nobugz:在这里实际调用 MemoryStream 上的 Dispose 仍然是合适的。 MemoryStream 不使用任何非托管资源这一事实是一个实现 细节。 MemoryStream 的 contract 说它实现了 IDisposable,因此,它应该始终调用 Dispose。与具体的实现细节相比,根据合同编写代码总是更好。 @capser:是的,一些程序员喜欢机器告诉他们该做什么。这是我不信奉的宗教,我更愿意明知故犯地打破规则。继续按照自己的方式去做,你永远不会被证明是错误的。只是呆滞。 我必须在这里同意@casperOne。静态分析对于及早发现缺陷非常有价值。 FxCop 之类的工具尤其有助于发现设计问题,如果在产品周期的后期发现这些问题,解决这些问题的成本通常很高。当您知道自己在做什么时,打破规则是完全可以的;这就是为什么存在像[SuppressMessage]
这样的注释的原因——它表明做出了有意识的“违反规则”的选择,而不是简单地无知规则。
【参考方案1】:
这有 FxCop 规则吗?是的,不是的。
在 Visual Studio 2005 代码分析所基于的 FxCop 1.35 中,有一条规则 DisposeObjectsBeforeLosingScope 正是这样做的。
在 FxCop 1.36(Visual Studio 2008 代码分析)中,他们删除了数据流分析引擎,这意味着也必须删除此规则。
不过,在接下来的 FxCop(Visual Studio 2010 代码分析)中,DisposeObjectsBeforeLosingScope 好像又回来了!
【讨论】:
+1。不知道它已添加到 2010 年。虽然我不一定同意该规则,但这是对问题的直接回答。 顺便说一句:在您的第二个链接上:“返回一次性对象需要在使用块之外的 try/finally 块中构造对象”是什么意思?? 他们实际上在那篇文章的示例中涵盖了这一点。查看OpenPort2
方法。基本上,如果对象已构造但未能初始化,则在向用户抛出异常之前应该是Dispose()
'd(否则它会超出范围)。 using
在这里不合适,因为 调用者 预计稍后会调用 Dispose()
。
好的。同意。但是我不能通过使用try-catch
并在处理串行端口后重新抛出异常来做同样的事情吗?这样我就不需要tempPort
变量了。
是的,可能差不多。但我认为他们这样做的原因更多是关于惯例和一致性。大多数人希望在 finally 块中看到资源清理,并且在有多个 catch 处理程序的情况下也可以避免重复。调试器捕获/重新抛出与不捕获的行为方式也存在细微差别(请参阅blogs.msdn.com/jmstall/archive/2007/02/07/catch-rethrow.aspx)。以上是关于本地使用的 IDisposable 是不是有 FxCop 规则?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 FxCop 坚持使用 IDisposable 作为结构
为啥我在 IDisposable 类中获得带有私有成员 IDisposable 的 CA2000?