StyleCop / FxCop 10 - 如何仅在命名空间级别上正确抑制消息?

时间:2011-06-17 13:58:39

标签: c# namespaces fxcop stylecop suppressmessage

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和谷歌搜索但我找不到任何显示如何专门针对这个实例。我发现最接近的是Scope =“namespace”,但我不确定这是否意味着它会影响实际的命名空间名称,或者它是否会影响该命名空间中的所有内容。

3 个答案:

答案 0 :(得分:14)

MSDN - CA1709: Identifiers should be cased correctly

  

如果是,可以安全地禁止此警告   你有自己的命名约定,   或者如果标识符代表一个   专有名称,例如,名称   公司或技术。

     

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


话虽如此,如果你觉得有理由压制这个消息,那真的并不难。在FxCop 10中右键单击要禁止的任何邮件,然后转到复制为>抑制消息或复制为>模块级抑制消息。

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

在你的实例中,没有特定的位置来放置属性(默认情况下它应该复制为[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'符号,否则所有这些都将毫无结果。转到属性>构建并添加条件编译符号。

答案 1 :(得分:3)

.NET naming conventions中的同义词并不是全部大写。例如HttpResponse等。

来自capitalization conventions

  

首字母缩写词的大小取决于首字母缩略词的长度。所有首字母缩略词都至少有两个字符。出于这些指南的目的,如果首字母缩略词恰好是两个字符,则它被视为简短的首字母缩略词。三个或更多字符的首字母缩写是一个很长的缩写词。

     

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

     

将两个字符缩写词的两个字符大写,除了驼峰标识符的第一个单词。

     

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

     

请仅使用三个或更多字符的缩写词的第一个字符大写,除了驼峰标识符的第一个单词。

     

名为XmlWriter的类是用作Pascal标识符的第一个单词的长首字母缩写的示例。名为htmlReader的参数是用作camel-cased标识符的第一个单词的长首字母缩写的示例。

答案 2 :(得分:0)

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