你希望 FxCop/宪兵有啥规则?

Posted

技术标签:

【中文标题】你希望 FxCop/宪兵有啥规则?【英文标题】:What rule do you wish FxCop/Gendarme had?你希望 FxCop/宪兵有什么规则? 【发布时间】:2010-02-16 14:29:51 【问题描述】:

您希望看到哪些可定义的静态代码检查规则添加到 FxCop 和/或宪兵?

您为什么希望看到添加的规则,例如有什么好处等?

您的规则如何实施?

【问题讨论】:

FXCop 不执行静态代码检查,它检查已编译的程序集 (IL)。静态代码分析是通过 StyleCop 完成的。 @BeowulfOF,我想说 FXCop 确实进行了静态代码检查,它只是不检查“=”等两侧的空格数。StyleCop 进行更多样式检查,例如id 不跟踪方法等之间的控制流。 Microsoft 声明 FXCop 只分析程序集,而不分析源代码。 msdn.microsoft.com/en-us/library/bb429476%28VS.80%29.aspx @BeowulfOF:虽然它仍然是静态分析 - 它不对正在运行的代码进行任何检查。 【参考方案1】:

我想快速定义和实施我自己的规则。我为 FxCop 尝试过一次,但我发现 API 不是很清楚 - 并且没有太多的文档。我用的是 FxCop 1.36,也许事情发生了变化……

所以我希望看到 FxCop 有一个清晰且易于使用的界面……那太好了 :)

我尝试实施的规则是:

DocumentInternalMethods DocumentInternalTypes ...

基本上我想对非公共成员强制执行 xml-cmets。

【讨论】:

为此使用 StyleCop,它有一个内置规则。 XML-cmets 无论如何都不会编译为程序集,因此 FXCop 无法查看是否定义了这些,因为它只分析已编译的程序集。 我知道 StyleCop,但此时我想在 FxCop 中实现它——我做到了。你是对的,你必须单独加载 xml 文件。【参考方案2】:

就个人而言,我更希望在 using 语句中不使用 IDisposable 实现。

如果你有这样的代码:

var fs = new FileStream(...);

// Other code.

fs.Dispose();

它会告诉你在 using 语句中使用它。

这样做的好处是它会提醒您注意您可能不知道应该处置的对象没有及时处置的情况。

但是,有足够多的时间,在 using 语句中不声明 IDisposable 实现是有效的,这样的规则很快就会变得很痛苦。大多数情况下,这种情况将IDisposable 实现作为方法的参数。

我所做的不是的意思是类的用法,其中实现细节消除了调用Dispose的需要,(例如MemoryStreamDataContext);这些实现 IDisposable 并且应该始终调用 Dispose,而不管实现细节如何,因为根据暴露的合约编写代码总是更好。

【讨论】:

@Ian Ringrose:更新了我的回复以澄清。 VS2010 代码分析对此有一个非破坏性规则:msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx【参考方案3】:

我真的希望二进制分析足够聪明,能够识别出接口的可能性。

它是否可以通过接近定义的类型及其成员来确定,是否有可以推断为接口的公共资源。

显然,这不仅仅是一个警告,因为有时希望明确不使用接口。

【讨论】:

【参考方案4】:

考虑到这一点,我也希望看到二进制分析足够聪明,以检查访问修饰符可能的降级。

确定一个类、属性或方法是否可以受到更多限制应该不难。

【讨论】:

以上是关于你希望 FxCop/宪兵有啥规则?的主要内容,如果未能解决你的问题,请参考以下文章

我的 FXCop 规则集有啥问题?

如何在所有开发者之间共享 FxCop 规则?

FxCop 自定义规则文档。为啥找不到我的网址?

如何在 FxCop 的自定义规则中获取传递给方法的参数值?

FxCop 中的自定义规则仅适用于由特定类型的方法调用的方法

在 TeamCity 中全局禁用 FxCop 错误