对于任何C#开发人员,哪些"必须遵循"的FxCop规则?

时间:2020-03-06 14:49:16  来源:igfitidea点击:

我计划在我们正在进行的项目之一中开始使用FxCop。但是,当我尝试选择所有可用规则时,似乎必须对代码进行大量更改。作为"团队成员",我不能马上开始进行这些更改,例如命名约定更改等。无论如何,我想开始使用带有最小规则集的FxCop,并随着我们的进行逐渐增加规则集。我们能建议我一些必须具有FxCop规则的我应该开始遵循的规则。还是我们建议任何更好的方法?

注意:我的大部分代码都在C#中。

解决方案

设计和安全规则是一个很好的起点。

我认为,请执行以下操作:

对于任何新项目,请遵循所有FxCop规则。我们可能要禁用其中的一些,因为并非所有项目都对项目有意义。
对于现有项目,请至少遵循以下类别中的规则:

  • 全球化
  • 互通性
  • 安全
  • 表现
  • 可移植性

与其他类别相比,由于这些通常仅是现有项目中很少违反规则的行为,因此可以提高应用程序的质量。明确这些规则后,请尝试修复以下类别:

  • 设计
  • 用法

因为这些将使我们更容易发现与违规有关的错误,但是在现有代码中将有大量违规。

始终按级别/修复程序类别对违规进行排序,并从严重违规开始。暂时跳过警告。

如果我们不知道,Microsoft还可提供StyleCop,在源代码级别检查代码。确保在安装过程中启用MSBuild集成。

在我们最重要的代码上:

  • 将警告视为错误(级别4)
  • FxCop必须通过100%(通常不允许忽略)
  • 宪兵用作指导(有时与FxCop冲突)

信不信由你,FxCop会教我们很多有关如何编写更好的代码的技巧...很棒的工具!因此,对我们而言,所有规则都同样重要。

我们是一家网上商店,因此我们删除了以下规则:

  • 与Interop兼容(除非客户付费,否则我们不支持COM集成!)
  • 密钥签名(Web应用程序不需要高安全性)

有时,由于某些CMS仍是.NET 2.0,我们将放弃在依赖关系中使用更高框架的规则,但这并不意味着DAL /业务层就不能成为.NET 3.5,只要我们不尝试。返回一个IQueryable(或者任何.NET 3、3.5)。

我完全同意Sklivvz。但是对于现有项目,我们可以按类别清理FxCop违规行为。

宪兵不时接受非常有用的新规则。因此,我们还可以使用Gendarme。

在我们的流程中,我们启用了所有规则,然后在审核过程中必须对所有抑制作辩护。通常,就期限或者错误引起的错误而言,不可能以省时的方式解决错误(有时会发生这种错误(尤其是在体系结构通过反射处理插件的情况下)。

我们还为全球化编写了一个自定义规则,以替换现有规则,因为我们不想对传递给异常的字符串进行全球化。

总的来说,我想最好是遵守所有规则。在当前的家庭项目中,我有四种构建配置,一组指定CODE_ANALYSIS定义,而另一组没有。这样,仅通过构建非CODE_ANALYSIS配置,我就可以看到所有我抑制的消息。这意味着可以定期查看被抑制的消息,并根据需要潜在地解决或者删除它们。

从长远来看,我想做的是一个构建步骤,该分析步骤将SuppressMessage属性与实际错误进行比较,并突出显示不再需要的那些抑制,但是目前我的设置无法实现这些抑制。

FxCop的替代方法是使用工具NDepend,该工具可以通过CLINQ查询(即CQLinq)编写代码规则。免责声明:我是该工具的开发人员之一

默认情况下,建议使用200多个代码规则。借助众所周知的CLINQ语法,自定义现有规则或者创建自己的规则非常简单。

NDepend在某些​​代码规则上与FxCop重叠,但是提出了许多独特的代码规则。以下是一些我必须遵循的规则:

  • 避免通过类型测试来减少代码覆盖率
  • 避免使复杂的方法变得更加复杂(Source CC)
  • 避免将不可变类型转换为可变类型
  • Method()的重写应调用base.Method()
  • 避免单例模式
  • 具有一次性实例字段的类型必须是一次性的
  • 具有非托管资源的一次性类型应声明终结器
  • 避免名称空间相互依赖
  • 避免名称空间依赖周期
  • UI层不应直接使用数据库类型
  • API重大更改:方法
  • 测试部分涵盖的复杂方法应100%涵盖
  • 潜在死亡的类型
  • 结构应该是不变的
  • 避免使用相同的标识符命名类型和名称空间

请注意,可以在生成的HTML + javascript报告中在Visual Studio中以及构建过程中实时验证规则。

一次启用一个规则。修复或者排除它报告的任何警告,然后从下一个警告开始。

一些规则可以避免我们的错误或者泄漏:

  • 不要捕获一般的异常类型(对我们来说可能是最好的规则。根据情况,执行起来可能很容易,也可能很难。)
  • 正确测试NaN(易于执行)
  • 应处理一次性字段(非常容易执行)
  • 处置应称为基础处置(相当容易执行)
  • 一次性类型应声明终结器(相当容易执行)

有些方法可以帮助我们设计更好,但请注意,当中央API受到影响时,它们可能会导致我们进行大量重构。我们喜欢

  • 集合属性应为只读(在我们的案例中很难执行)
  • 不公开通用列表
  • 成员不应公开某些具体类型
  • 查看常用的参数(轻松改进API)

我们项目中的某人尝试了性能规则,但没有任何改进。 (实际上,这些规则是关于微优化的,如果没有瓶颈识别表明需要进行微优化,则不会产生任何结果)。我建议不要从这些开始。

最小的fxcop和代码分析(如果使用VS2010 Premium或者Ultimate)如下:http://msdn.microsoft.com/zh-cn/library/dd264893.aspx