禁止单个StyleCop消息

时间:2014-02-21 14:49:12

标签: stylecop

我正在寻找一种方法来压缩StyleCop创建的方法或类级别的个别违规消息。

提供我正在寻找的简单示例..

// Attribute will suppress all occurrences of violation "SA1306" 
// within the Testing1() method.
[SuppressMessage("StyleCop.CSharp.NamingRules", 
                 "SA1306:FieldNamesMustBeginWithLowerCaseLetter", 
                  Justification = "Reviewed. Suppression is   OK here.")]
public void Testing1()
{
  //Fires off SA1306
  var Temp = "";
  //Also fires off SA1306
  var Temp2 = "";
}

有了上述内容,我想知道是否有方法可以抑制第一次违规,但仍有第二次违规

我搜索过并发现了一些相关问题,但我想知道这是否可行。

感谢。

2 个答案:

答案 0 :(得分:0)

规则SA1306用于以小写字母开头的字段名称。我会避免试图压制这一点,因为以大写字母开头的字段名称可能会被误认为对象的属性。

我不推荐这种编码方式,并且总是坚持以大写字母开头的属性和以小写字母开头的字段。这将有助于代码中的可读性和意图。

答案 1 :(得分:0)

在StyleCop记录规则违规之前,它会检查是否应该禁止违规。它通过检查是否在元素(导致违规)或其任何父项(例如,类将是方法的父类,方法将是变量声明元素的父元素)中指定抑制来执行此操作。方法)。 这意味着方法内部的两个不同违规将被方法本身的抑制所抑制。

这里的关键是如何搜索匹配元素以及搜索哪些元素。以下方法在CsParser.cs中,在源的CSharperParser项目中:

private static bool MatchElementWithPossibleElementsTraversingParents(CsElement element, IList<CsElement> possibleElements)
    {
        Param.AssertNotNull(element, "element");
        Param.AssertNotNull(possibleElements, "possibleElements");

        // Loop through each possible element using a for-style loop rather than a foreach, since this
        // is faster and this method is called very often.
        for (int i = 0; i < possibleElements.Count; ++i)
        {
            CsElement possibleMatch = possibleElements[i];

            // Walk through the element and each of its parents to see if any is a match.
            CsElement item = element;
            while (item != null)
            {

                if (item == possibleMatch)
                {
                    return true;
                }

                item = item.FindParentElement();
            }
        }

        return false;
    }

备份一点以理解上下文,参数CsElement元素将是已检测到违规的已解析标记的父元素,而possibleElements是与抑制规则关联的CsElements列表。 通过此方法的每个元素都将匹配stylecop使用的“ElementType”枚举。一些示例元素类型是class,field,constructor和using指令,其中一个元素类型将与所讨论的违规相关联。

在我的问题中列出的示例中,这实际上是会发生的事情;

  • 规则分析器(如SpacingRules.cs)会遇到'var Temp =“”;''的违规行为并将它的行号/位置和当前令牌父元素报告给stylecop的核心。
  • 然后,Stylecop将通过MatchElementWithPossibleElementsTraversingParents运行,该语句以语句的父元素开头,即方法'Testing1()'。
  • 这里我们的possibleMatch是CsElement,方法'Testing1()',由于在它上面放置了一个抑制属性,因此它被解析并添加到抑制列表中。
  • 元素匹配,因此第一次违规将被抑制。
  • 在此之后,将在下一个声明中找到另一种相同类型的违规行为。然而,它的父类型是首先搜索的内容,因此'Testing1()'。

因此,两个违规都被相同的抑制属性所抑制,所以我的问题的答案最终是否定的。