Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FxCop:复合词应被视为离散词_C#_Fxcop - Fatal编程技术网

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

C# FxCop:复合词应被视为离散词,c#,fxcop,C#,Fxcop,FxCop希望我用大写字母N(即用户名)拼写用户名,因为它是一个复合词。然而,由于一致性的原因,我们需要用小写的n来拼写它,所以可以是用户名或用户名 我已尝试通过向CodeAnalysisDictionary.xml添加以下部分来调整CodeAnalysisDictionary.xml: <DiscreteExceptions> <Term>username</Term> </DiscreteExceptions> 用户名 根据我对自定义

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

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

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

用户名
根据我对自定义词典工作原理的理解,这应该告诉FxCop将用户名视为离散术语,并防止复合词shouldbecasedcorrectly(CA1702)检查引发错误

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


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

在FxCop随附的自定义词典中(位于我的系统中的C:\Program Files\Microsoft FxCop 1.36\CustomDixtionary.xml,但YMMV),在Word\Compounds中有一个
用户名
条目。删除它。您仍然需要离散异常。

我在FxCop/托管代码分析团队中做了3年的开发人员,我有您的答案。自从我的时代以来,情况发生了变化,我已经完全忘记了自定义词典处理是如何工作的,因此我花了相当多的时间才弄明白这一点。:)

执行摘要 简而言之,您需要从C:\Program Files(x86)\Microsoft FxCop 1.36\CustomDictionary.xml中删除对用户名、用户名、用户名和用户名的所有引用

通常情况下,我不建议这样做,因为它不应该是必需的,但您已经发现了我认为是一个bug,这是我能找到的唯一解决方法

全部故事 好的,现在是长答案

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

A.检查应该是离散的复合词
  • 将标识符拆分为标记:例如
    FileName-->{“file”,“name”}
  • 对每对相邻的令牌进行拼写检查
  • 如果拼写检查成功(例如,
    filename
    被视为有效单词),
    然后我们发现了一个潜在的问题,因为一个单词不应该表示为 两个代币
  • 但是,如果存在
    文件名
    在自定义词典的
    部分,则表示 虽然
    filename
    是一个词,但设计指南(主要是为了一致性) 在规则存在之前的框架内的现有技术)坚持 应该写为
    文件名
    ,因此我们必须抑制该警告
  • 另外,如果在
    ,则表示虽然“filename”是 一个词,在不同的上下文中也可能是两个词“file”和“name”。例如 “开始”是一个词,但要求用户将
    DoSomethingOnSet
    更改为
    DoSomethingOnset
    将是噪声,因此我们必须抑制该警告
  • B.检查应为复合词的离散词:
  • 从A.1中取出代币,对照化合物集分别检查每个代币 自定义词典中的术语
  • 如果存在匹配,则我们必须按照步骤a.4中的解释发出警告
  • 请注意,您的警告:
    Username
    应该是
    Username
    在第B部分中被检测到,该部分没有参考DiscreteExceptions部分,这就是您无法通过修改该部分来抑制警告的原因。问题是默认自定义词典中有一个条目指出
    username
    的正确大小写总是
    username
    。它需要以某种方式被删除或覆盖

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

    结论 鉴于FxCop除了使用项目自定义词典外,还始终使用其默认自定义词典,因此您唯一的方法是从默认自定义词典中删除有问题的条目


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

    您确定FxCop正在加载和使用您的文件吗?例如,它是否应用了其他规则?您是否签出了此问题@杰夫·斯特纳尔:我使用了一个已有的CodeAnalysisDictionary.xml,它已经进行了定制。我刚刚删除了一些现有的条目,正如预期的那样,我现在得到了更多的警告,因此FxCop通常能够识别字典并正确地应用附加的术语和单词@奥斯汀·萨洛宁:是的,我找到了,但我找不到任何适用于我的具体问题的东西。字典本身正在运行,但它似乎没有像我预期的那样将用户名作为一个离散术语来对待。谢谢你的详细回答。这证实了我的猜测,但当FxCop检查是否符合规则时,获得一些关于FxCop如何工作的信息是件好事。@Nick:阅读您的摘要,如果我添加一个条目和一个条目,我应该能够在没有警告的情况下同时拥有这两个版本。我读对了吗?谢谢你的回复