c# - FxCop:复合词应被视为离散词

标签 c# fxcop

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.检查应该是离散的复合词

  1. 将标识符拆分为标记:例如FileName --> { "file", "name" }
  2. 对每对相邻的标记进行拼写检查。
  3. 如果拼写检查成功(例如 filename 被认为是一个有效的词),
    然后我们发现了一个潜在的问题,因为一个词不应该被表达为 两个 token 。
  4. 但是,如果有 <Term CompoundAlternate="FileName">filename</Term><Compound>自定义词典的部分,那么它的意思是 虽然filename是一个词,设计指南(主要是为了一致性 框架中早于规则存在的现有技术)坚持它 应该写成FileName ,所以我们必须抑制警告。
  5. 此外,如果有 <Term>filename</Term><DiscreteExceptions> 中输入 自定义词典的一部分,那么它的意思是尽管“文件名”是 一个词,在不同的上下文中也可能是两个词"file"和“名称”。例如 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 除了项目自定义词典之外,始终使用其默认自定义词典,您唯一的办法是从默认自定义词典中删除相关条目。

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

关于c# - FxCop:复合词应被视为离散词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2006795/

相关文章:

c# - LINQ:不支持将 var 作为方法参数传递

c# - .NET 随机 RGB 颜色

.net - 为什么我在 IDisposable 类中获得带有私有(private)成员 IDisposable 的 CA2000?

msbuild - 是否可以在未安装 VS 的情况下从 MSBuild 命令行运行 FxCop 代码分析?

.net - FxCop 10.0 独立无法分析使用 AutoMapper 的程序集

c# - C#查看邮件状态是否送达

c# - 为什么常量字段不能是 C# 中的非内置结构类型?

c# - 检测 USB 连接——C# .Net CF 3.5

c# - 如何获取FxCop中callvirt IL指令实际调用的方法

internationalization - 如何更改 FxCop 语言?