FxCop:复合词应视为离散术语

时间:2010-01-05 15:00:37

标签: c# fxcop

FxCop希望我用大写字母N(即UserName)拼写用户名,因为它是一个复合词。但是,由于一致性的原因,我们需要使用小写n拼写它 - 所以用户名或用户名。

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

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

根据我的理解自定义词典的工作方式,这应该告诉FxCop将用户名视为一个离散的术语,并阻止CompoundWordsShouldBeCasedCorrect(CA1702)检查以触发错误。

不幸的是,这不起作用。有没有人知道为什么会这样,以及如何解决这个问题?我不想添加抑制,因为这会严重混乱GlobalSuppressions文件,因为有很多事件发生。

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

2 个答案:

答案 0 :(得分:31)

我是FxCop /托管代码分析团队的开发人员已有3年了,我有你的答案。自从我的时间以来,情况发生了变化,我已经忘记了自定义词典处理的确切方式,因此我花了很多时间来解决这个问题。 :)

执行摘要

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

通常情况下,我不建议这样做,因为它不应该被要求,但你发现了我认为是一个错误,这是我能找到的唯一解决方法。

全文

好的,现在是回答......

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

一种。检查应该是离散的复合词

  1. 将标识符拆分为标记:例如FileName --> { "file", "name" }
  2. 拼写检查每对相邻的令牌。
  3. 如果拼写检查成功(例如filename被视为有效词),则  然后我们发现了一个潜在的问题,因为单个词不应表示为  两个令牌。
  4. 但是,如果有<Term CompoundAlternate="FileName">filename</Term>  在自定义词典的<Compound>部分中,它被认为是指  虽然filename是一个词,但设计指南(主要是为了保持一致性)  在框架中的现有技术早于规则的存在)坚持它  应该写成FileName,因此我们必须取消警告。
  5. 此外,如果<Term>filename</Term>中有<DiscreteExceptions>个条目  自定义词典的一部分,然后它被认为是指虽然'文件名'是  一句话,它也可能是两个单词'file'和'name'在不同的上下文中。例如  Onset是一个单词,但要求用户将DoSomethingOnSet更改为  DoSomethingOnset会产生噪音,因此我们必须取消警告。
  6. B中。检查应该是复合的离散单词:

    1. 从A.1中取出代币,分别根据一组化合物检查每个代币  自定义词典中的术语。
    2. 如果匹配,则必须按照步骤A.4中的解释进行警告。
    3. 请注意,警告:Username在{B}部分中检测到UserName,但不会参考DiscreteExceptions部分,这就是您无法通过修改该部分来抑制警告的原因。问题是默认自定义词典有一个条目,指出username的正确大小始终为UserName。它需要以某种方式被删除或覆盖。

      The Bug

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

      结论

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

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

答案 1 :(得分:3)

在Words \ Compounds中的FxCop(位于我的系统中 C:\ Program Files \ Microsoft FxCop 1.36 \ CustomDixtionary.xml ,但是YMMV)附带的自定义词典中{{1进入。删除它。你仍然需要离散的例外。