FxCop希望我用大写字母N(即UserName)拼写用户名,因为它是一个复合词。但是,由于一致性的原因,我们需要使用小写n拼写它 - 所以用户名或用户名。
我尝试通过在以下部分添加以下部分来调整CodeAnalysisDictionary.xml:
<DiscreteExceptions>
<Term>username</Term>
</DiscreteExceptions>
根据我的理解自定义词典的工作方式,这应该告诉FxCop将用户名视为一个离散的术语,并阻止CompoundWordsShouldBeCasedCorrect(CA1702)检查以触发错误。
不幸的是,这不起作用。有没有人知道为什么会这样,以及如何解决这个问题?我不想添加抑制,因为这会严重混乱GlobalSuppressions文件,因为有很多事件发生。
编辑添加:目前我已经通过使用GlobalSuppressions解决了这个问题,但鉴于问题的性质,这似乎不是解决此问题的理想方法。任何人都可以提示在哪里寻找有关FxCop如何应用字典中定义的规则的更多信息?
答案 0 :(得分:31)
我是FxCop /托管代码分析团队的开发人员已有3年了,我有你的答案。自从我的时间以来,情况发生了变化,我已经忘记了自定义词典处理的确切方式,因此我花了很多时间来解决这个问题。 :)
简短的回答是您需要从C:\ Program Files(x86)\ Microsoft FxCop 1.36 \ CustomDictionary.xml中删除对用户名,用户名,用户名和用户名的所有引用。
通常情况下,我不建议这样做,因为它不应该被要求,但你发现了我认为是一个错误,这是我能找到的唯一解决方法。
好的,现在是长回答......
该规则有两个不同的检查,其工作方式如下:
FileName --> { "file", "name" }
filename
被视为有效词),则
然后我们发现了一个潜在的问题,因为单个词不应表示为
两个令牌。<Term CompoundAlternate="FileName">filename</Term>
在自定义词典的<Compound>
部分中,它被认为是指
虽然filename
是一个词,但设计指南(主要是为了保持一致性)
在框架中的现有技术早于规则的存在)坚持它
应该写成FileName
,因此我们必须取消警告。<Term>filename</Term>
中有<DiscreteExceptions>
个条目
自定义词典的一部分,然后它被认为是指虽然'文件名'是
一句话,它也可能是两个单词'file'和'name'在不同的上下文中。例如
Onset是一个单词,但要求用户将DoSomethingOnSet
更改为
DoSomethingOnset
会产生噪音,因此我们必须取消警告。请注意,警告:Username
在{B}部分中检测到UserName
,但不会参考DiscreteExceptions部分,这就是您无法通过修改该部分来抑制警告的原因。问题是默认自定义词典有一个条目,指出username
的正确大小始终为UserName
。它需要以某种方式被删除或覆盖。
现在,理想的解决方案是单独保留默认自定义词典,在项目文件中指定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进入。删除它。你仍然需要离散的例外。