我在 FxCop / 托管代码分析团队担任了 3 年的开发人员,我有你的答案。从那时起事情已经发生了变化,我已经忘记了自定义字典处理是如何工作的,所以我花了很多时间来弄清楚这一点。:)
执行摘要
简短的回答是您需要从 C:\Program Files (x86)\Microsoft FxCop 1.36\CustomDictionary.xml 中删除对用户名、用户名、用户名和用户名的所有引用。
通常,我不建议这样做,因为它不是必需的,但是您发现了我认为是错误的地方,这是我能找到的唯一解决方法。
全文
好的,现在是长答案...
该规则有两个不同的检查,其工作方式如下:
A. 检查应该是离散的复合词
- 将标识符拆分为标记:例如
FileName --> { "file", "name" }
- 拼写检查每对相邻的标记。
- 如果拼写检查成功(例如
filename
被认为是一个有效的单词),
那么我们发现了一个潜在的问题,因为一个单词不应该被表示为两个标记。
- 但是,如果自定义词典
<Term CompoundAlternate="FileName">filename</Term>
的<Compound>
部分中有 a,则表示虽然filename
是一个词,但设计指南(主要是为了与规则存在之前的框架中的现有技术保持一致)坚持它应该写成FileName
,所以我们必须压制警告。
- 此外,如果自定义词典
<Term>filename</Term>
的部分中有条目<DiscreteExceptions>
,则表示虽然“文件名”是一个词,但在不同的上下文中它也可能是两个词“文件”和“名称”。例如,Onset 是一个词,但要求用户更改DoSomethingOnSet
为
DoSomethingOnset
会是噪音,因此我们必须抑制警告。
B. 检查应该是复合词的离散词:
- 从 A.1 中取出标记,根据自定义词典中的复合术语集分别检查每个标记。
- 如果存在匹配,那么我们必须按照步骤 A.4 中的解释进行警告。
请注意,您的警告:Username
应该UserName
在 B 部分中检测到,该部分未参考 DiscreteExceptions 部分,这就是您无法通过修改该部分来抑制警告的原因。问题是默认的自定义字典有一个条目说明正确的大小写username
始终是UserName
。它需要以某种方式被删除或覆盖。
错误
现在,理想的解决方案是保留默认自定义字典,SearchFxCopDir=false
在您的项目文件中指定,然后仅合并您在用于您的项目的 CustomDictionary.xml 中需要的默认自定义字典的部分。遗憾的是,这不起作用,因为 FxCop 1.36 忽略了 SearchFxCopDir 指令并始终将其视为 true。我认为这是一个错误,但也有可能是故意更改,因为该指令没有记录并且没有相应的 UI。老实说,我不知道...
结论
鉴于 FxCop 除了项目自定义字典外,始终使用其默认自定义字典,您唯一的办法就是从默认自定义字典中删除相关条目。
如果有机会,我会联系当前的代码分析团队,看看这是否真的是一个错误,并在这里报告......