32

FxCop 希望我用大写 N 拼写用户名(即用户名),因为它是一个复合词。然而,由于一致性的原因,我们需要用小写的 n 来拼写 - 所以要么是用户名,要么是用户名。

我尝试通过将以下部分添加到该部分来调整 CodeAnalysisDictionary.xml:

<DiscreteExceptions>
  <Term>username</Term>
</DiscreteExceptions>

据我了解自定义词典的工作原理,这应该告诉 FxCop 将用户名视为离散术语并防止 CompoundWordsShouldBeCasedCorrectly (CA1702) 检查触发错误。

不幸的是,这不起作用。有谁知道为什么会这样以及如何解决这个问题?我不想添加抑制,因为这会严重混淆 GlobalSuppressions 文件,因为出现的次数很多。

编辑添加:目前我已经通过使用 GlobalSuppressions 解决了这个问题,但考虑到问题的性质,这似乎不是解决这个问题的理想方法。任何人都可以提示在哪里寻找有关 FxCop 如何应用字典中定义的规则的更多信息?

4

2 回答 2

33

我在 FxCop / 托管代码分析团队担任了 3 年的开发人员,我有你的答案。从那时起事情已经发生了变化,我已经忘记了自定义字典处理是如何工作的,所以我花了很多时间来弄清楚这一点。:)

执行摘要

简短的回答是您需要从 C:\Program Files (x86)\Microsoft FxCop 1.36\CustomDictionary.xml 中删除对用户名、用户名、用户名和用户名的所有引用。

通常,我不建议这样做,因为它不是必需的,但是您发现了我认为是错误的地方,这是我能找到的唯一解决方法。

全文

好的,现在是答案...

该规则有两个不同的检查,其工作方式如下:

A. 检查应该是离散的复合词

  1. 将标识符拆分为标记:例如FileName --> { "file", "name" }
  2. 拼写检查每对相邻的标记。
  3. 如果拼写检查成功(例如filename被认为是一个有效的单词),
    那么我们发现了一个潜在的问题,因为一个单词不应该被表示为两个标记。
  4. 但是,如果自定义词典<Term CompoundAlternate="FileName">filename</Term><Compound>部分中有 a,则表示虽然filename是一个词,但设计指南(主要是为了与规则存在之前的框架中的现有技术保持一致)坚持它应该写成FileName,所以我们必须压制警告。
  5. 此外,如果自定义词典<Term>filename</Term>的部分中有条目<DiscreteExceptions> ,则表示虽然“文件名”是一个词,但在不同的上下文中它也可能是两个词“文件”和“名称”。例如,Onset 是一个词,但要求用户更改DoSomethingOnSetDoSomethingOnset会是噪音,因此我们必须抑制警告。

B. 检查应该是复合词的离散词:

  1. 从 A.1 中取出标记,根据自定义词典中的复合术语集分别检查每个标记。
  2. 如果存在匹配,那么我们必须按照步骤 A.4 中的解释进行警告。

请注意,您的警告:Username应该UserName在 B 部分中检测到,该部分未参考 DiscreteExceptions 部分,这就是您无法通过修改该部分来抑制警告的原因。问题是默认的自定义字典有一个条目说明正确的大小写username始终是UserName。它需要以某种方式被删除或覆盖。

错误

现在,理想的解决方案是保留默认自定义字典,SearchFxCopDir=false在您的项目文件中指定,然后仅合并您在用于您的项目的 CustomDictionary.xml 中需要的默认自定义字典的部分。遗憾的是,这不起作用,因为 FxCop 1.36 忽略了 SearchFxCopDir 指令并始终将其视为 true。我认为这是一个错误,但也有可能是故意更改,因为该指令没有记录并且没有相应的 UI。老实说,我不知道...

结论

鉴于 FxCop 除了项目自定义字典外,始终使用其默认自定义字典,您唯一的办法就是从默认自定义字典中删除相关条目。

如果有机会,我会联系当前的代码分析团队,看看这是否真的是一个错误,并在这里报告......

于 2010-01-12T07:27:01.593 回答
4

在 FxCop 附带的自定义字典中(位于我的系统中C:\Program Files\Microsoft FxCop 1.36\CustomDixtionary.xml,但 YMMV)在 Words\Compounds 中有一个<Term CompoundAlternate="UserName">username</Term>条目。删除它。您仍然需要离散异常。

于 2010-01-12T06:24:06.253 回答