FxCop 要我用大写 N 拼写用户名(即用户名),因为它是一个复合词。但是,出于一致性原因,我们需要将其拼写为小写字母 n - 因此要么是用户名,要么是用户名。
我尝试通过将以下部分添加到该部分来调整 CodeAnalysisDictionary.xml:
<DiscreteExceptions>
<Term>username</Term>
</DiscreteExceptions>
据我了解自定义词典的工作原理,这应该告诉 FxCop 将用户名视为离散术语并防止 CompoundWordsShouldBeCasedCorrectly (CA1702) 检查引发错误。
不幸的是,这不起作用。有谁知道为什么会这样以及如何解决这个问题?我不想添加抑制,因为这会严重扰乱 GlobalSuppressions 文件,因为出现的次数很多。
编辑添加:目前我已经使用 GlobalSuppressions 解决了这个问题,但考虑到问题的性质,这似乎不是解决这个问题的理想方法。任何人都可以提示在哪里可以找到有关 FxCop 如何应用字典中定义的规则的更多信息吗?
最佳答案
我在 FxCop/托管代码分析团队担任了 3 年的开发人员,我得到了您的答案。自从我那个时代以来,情况发生了变化,我已经完全忘记了自定义字典处理是如何工作的,所以我花了很多时间才弄清楚这一点。 :)
执行摘要
简短的回答是,您需要从 C:\Program Files (x86)\Microsoft FxCop 1.36\CustomDictionary.xml 中删除对用户名、用户名、用户名和用户名的所有引用。
通常,我不会推荐这样做,因为它不是必需的,但我认为您发现了一个错误,这是我能找到的唯一解决方法。
全文
好的,现在是长的答案......
该规则有两个不同的检查,其工作方式如下:
A.检查应该是离散的复合词
- 将标识符拆分为标记:例如
FileName --> { "file", "name" }
- 对每对相邻的标记进行拼写检查。
- 如果拼写检查成功(例如
filename
被认为是一个有效的词),
然后我们发现了一个潜在的问题,因为一个词不应该被表达为 两个 token 。 - 但是,如果有
<Term CompoundAlternate="FileName">filename</Term>
在<Compound>
自定义词典的部分,那么它的意思是 虽然filename
是一个词,设计指南(主要是为了一致性 框架中早于规则存在的现有技术)坚持它 应该写成FileName
,所以我们必须抑制警告。 - 此外,如果有
<Term>filename</Term>
在<DiscreteExceptions>
中输入 自定义词典的一部分,那么它的意思是尽管“文件名”是 一个词,在不同的上下文中也可能是两个词"file"和“名称”。例如 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 除了项目自定义词典之外,始终使用其默认自定义词典,您唯一的办法是从默认自定义词典中删除相关条目。
如果有机会,我会联系当前的代码分析团队,看看这是否真的是一个错误,然后在这里报告...
关于c# - FxCop:复合词应被视为离散词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2006795/