C# 对于本地使用的IDisposable';s

C# 对于本地使用的IDisposable';s,c#,.net,idisposable,fxcop,C#,.net,Idisposable,Fxcop,。。。如果我在局部变量中使用IDisposable,但不调用Dispose()或使用using()模式 就像字段的规则一样 编辑:将MemoryStream替换为FileStream,因为MemoryStream只分配内存,不使用(非托管)资源,因此有人可以讨论强制Dispose()调用。是否有FxCop规则?是和否 在VisualStudio2005代码分析所基于的FxCop 1.35中,有一条规则正好做到了这一点 在FxCop 1.36(Visual Studio 2008代码分析)中,他

。。。如果我在局部变量中使用IDisposable,但不调用Dispose()或使用using()模式

就像字段的规则一样



编辑:将MemoryStream替换为FileStream,因为MemoryStream只分配内存,不使用(非托管)资源,因此有人可以讨论强制Dispose()调用。

是否有FxCop规则?是和否

在VisualStudio2005代码分析所基于的FxCop 1.35中,有一条规则正好做到了这一点

在FxCop 1.36(Visual Studio 2008代码分析)中,他们删除了数据流分析引擎,这意味着也必须删除此规则


然而,在下一个FxCop(VisualStudio2010代码分析)中,它似乎又回来了

+1。不知道它被添加到2010年。虽然我不一定同意这个规则,但这是对这个问题的直接回答。顺便说一句:在你的第二个链接上:“返回一次性对象需要在使用块之外的try/finally块中构造对象”是什么意思?他们在那篇文章的示例中实际涵盖了这一点。查看
OpenPort2
方法。基本上,如果对象已构造但未能初始化,则在将异常抛出给用户之前,它应该是
Dispose()
'd(否则它将超出范围)。此处不适合使用
,因为调用者稍后会调用
Dispose()
。确定。同意。但是我不能使用
try-catch
并在处理串行端口后重新抛出异常,这样做吗?这样我就不需要
tempPort
变量了。是的,这可能差不多。但我认为他们这样做的原因更多的是出于惯例和一致性。大多数人希望在finally块中看到资源清理,并且在有多个catch处理程序的情况下,它还避免了重复。调试器在捕获/重缓存与不捕获的行为上也有细微的区别(请参阅)?这是毫无意义的,内存不是一次性的。希望我们不会得到一个说它是的工具,它会无可挽回地摧毁程序员的思维。@nobugz:在这里,实际调用MemoryStream上的Dispose仍然是正确的。MemoryStream不使用任何非托管资源这一事实是一个实现细节。MemoryStream的合同说它实现了IDisposable,因此,它应该始终调用它。根据合同编写代码总是比根据具体的实现细节编写代码要好。@capser:是的,有些程序员喜欢用机器来告诉他们该做什么。这是一个我不赞成的宗教,我宁愿在知情的情况下打破规则。按照你的方式去做吧,你永远不会被证明是错的。只是行动迟缓。我得同意这里的@casperOne。静态分析对于早期发现缺陷非常有价值。像FxCop这样的工具特别有助于发现设计问题,如果在产品周期的后期发现这些问题,修复这些问题的成本往往很高。当你知道自己在做什么的时候,违反规则是很好的;这就是为什么像
[SuppressMessage]
这样的注释存在的原因——它表明有意识地做出了“违反规则”的选择,而不是简单地忽略规则。
public void BadMethod()
{
    var fs = new FileStream("file.txt", FileMode.Create);
    fs.WriteByte(0x55);
    // no dispose, no using()
}