【问题标题】:StyleCop/FxCop 10 - How do you properly suppress a message only on a namespace level?StyleCop/FxCop 10 - 如何仅在命名空间级别正确抑制消息?
【发布时间】:2011-09-17 05:33:28
【问题描述】:

FxCop 10 抱怨以下问题:

using XYZ.Blah; //CA1709 - "XYZ"
using Xyz.Blah; //No complaint.

using XylophoneSuperDuperLongFullName.Blah; //I don't want to have a long full name for my company name.

问题是...我希望我的公司名称全部大写,因为 XYZ 是缩写。名称的长版本太长而不能成为有用的命名空间。微软不会使用这种东西,因为它们的首字母缩写词只有 2 个字母。

using MS.Something; //No Complaint.
using Microsoft.SomethingElse; //No Complaint.

所以,我正在考虑添加一个SuppressMessageAttribute 来抑制这个警告。但是,我不确定如何正确地做到这一点(或者甚至将它粘贴在哪里),以便它只影响这个实例。我不想抑制该名称空间中的任何内容,因为我想捕捉我犯的任何其他错误。我确实查看了 msdn 和 google 搜索,但我找不到任何显示如何专门针对此实例的内容。我找到的最接近的是 Scope = "namespace" 但我不确定这是否意味着它会影响实际的命名空间名称,或者它是否会影响该命名空间内的所有内容。

【问题讨论】:

    标签: c# namespaces fxcop stylecop suppressmessage


    【解决方案1】:

    如果您通过 StyleCop 检查名称,您可以使用支持可配置缩写列表的StyleCop+(自定义规则)。

    【讨论】:

      【解决方案2】:

      MSDN - CA1709: Identifiers should be cased correctly:

      如果出现以下情况,可以安全地取消此警告 你有自己的命名约定, 或者如果标识符代表一个 专有名称,例如, 公司或技术。

      您还可以添加特定术语, 缩写和首字母缩略词 代码分析自定义字典。条款 在自定义词典中指定 不会导致违反此 规则。有关详细信息,请参阅如何 to:自定义代码分析 字典。


      话虽如此,如果您觉得有理由压制该消息,那真的一点也不难。在 FxCop 10 中,右键单击要抑制的任何消息,然后转到 Copy As>Suppress-Message 或 Copy As>Module-level Suppress Message。

      您应该将SuppressMessageAttributes 放在适当的位置。抑制单个位置的属性应放置在该位置,例如,方法、字段、属性或类的上方。

      在你的例子中,没有特定的位置来放置属性(默认情况下它应该复制为[module: SuppressMessage(...)]。这很好地表明它属于一个文件的顶部,如果它是一个模块特定于文件的级别抑制(例如,特定于文件的资源)。或者,更有可能的是,它属于 GlobalSuppressions.cs 文件。

      using System.Diagnostics.CodeAnalysis;
      
      [module: SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Justification = "Because I said so!", MessageId = "XYZ", Scope = "namespace", Target = "XYZ.Blah")]
      

      如果您愿意,也可以缩短 CheckId 属性,但最好了解 CA1709 的含义。如果您不喜欢,这也可以:

      using System.Diagnostics.CodeAnalysis;
      
      [module: SuppressMessage("Microsoft.Naming", "CA1709", Justification = "Because I said so!", MessageId = "XYZ", Scope = "namespace", Target = "XYZ.Blah")]
      

      最后...除非您在构建中包含“CODE_ANALYSIS”符号,否则所有这些都将徒劳无功。转到 Properties>Build 并添加条件编译符号。

      【讨论】:

      • +1。它们在这里的关键是CODE_ANALYSIS 符号,我在任何其他 FxCop 文档中都没有注意到。我不知道必须在 VisualStudio 中添加它,也不知道为什么 FxCop 没有忽略任何东西!
      【解决方案3】:

      .NET naming conventions 中的缩略词并不意味着全部大写。比如HttpResponse

      来自capitalization conventions

      首字母缩写词的大小写取决于首字母缩写词的长度。所有首字母缩略词的长度至少为两个字符。就这些指南而言,如果首字母缩略词正好是两个字符,则将其视为短首字母缩略词。三个或更多字符的首字母缩写词是长首字母缩写词。

      以下准则指定了短首字母缩写词和长首字母缩写词的正确大小写。标识符大小写规则优先于首字母缩写词大小写规则。

      双字符首字母缩略词的两个字符都大写,驼峰式标识符的第一个单词除外。

      名为 DBRate 的属性是一个短首字母缩写词 (DB) 的示例,它用作 Pascal 大小写标识符的第一个单词。名为 ioChannel 的参数是一个缩写词 (IO) 的示例,它用作驼峰式标识符的第一个单词。

      除了驼峰式标识符的第一个单词之外,只有三个或更多字符的首字母缩写词的第一个字符大写。

      名为 XmlWriter 的类是用作 Pascal 大小写标识符的第一个单词的长首字母缩略词的示例。名为 htmlReader 的参数是一个长首字母缩写词的示例,该首字母缩写词用作驼峰式标识符的第一个单词。

      【讨论】:

      • 哦,我知道了。但也有例外:例如“DB”。不过从美学上讲,我发现XYZ.BlahXyz.Blah 更具可读性。特别是对于缩写的公司名称。因此......我想压制那个实例的消息。 :)
      • 哦,对不起。我的意思是“缩写”而不是首字母缩略词。我的公司名称缩写为 XYZ。我会解决的。
      • @Michael:老实说,缩写全部大写更奇怪。请注意,文档中涵盖了例外情况,我希望 StyleCop 知道这一点。虽然 可能会发现 XYZ.Blah 更具可读性,但我肯定会发现相反的情况 - 习惯于正常的 .NET 约定。
      • 好吧,无论如何。如何隐藏该警告消息?
      • @michael:假设#pragma warning disable 不起作用(我怀疑它不会起作用)我不知道在“代码区域”基础上禁用 StyleCop 警告的方法。