Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# StyleCop自定义规则:检查赋值时获取变量的类型_C#_Stylecop - Fatal编程技术网

C# StyleCop自定义规则:检查赋值时获取变量的类型

C# StyleCop自定义规则:检查赋值时获取变量的类型,c#,stylecop,C#,Stylecop,我正在编写一个自定义的StyleCop规则来防止字符串变量被赋值为null,但我遇到了一个问题 我可以使用以下代码轻松地防止在声明期间将字符串变量赋值为null: if (expression.ExpressionType == ExpressionType.VariableDeclarator) { VariableDeclaratorExpression variableDeclarator = ((VariableDeclaratorExpression)expression);

我正在编写一个自定义的StyleCop规则来防止字符串变量被赋值为null,但我遇到了一个问题

我可以使用以下代码轻松地防止在声明期间将字符串变量赋值为null:

if (expression.ExpressionType == ExpressionType.VariableDeclarator)
{
    VariableDeclaratorExpression variableDeclarator = ((VariableDeclaratorExpression)expression);

    if (variableDeclarator.Initializer == null)
    {
        if ((parentStatement.StatementType != StatementType.Catch) &&
            (parentStatement.StatementType != StatementType.Foreach))
        {
            this.AddViolation(parentElement, expression.LineNumber, "InitialiseVariablesOnDeclaration");
        }
    }
    else
    {
        Boolean isString = false;

        foreach (CsToken token in variableDeclarator.ParentVariable.Tokens)
        {
            if ((token.Text.Equals("String")) || (token.Text.Equals("string")))
            {
                isString = true;
                break;
            }
        }

        if (isString)
        {
            foreach (CsToken token in variableDeclarator.Initializer.Tokens)
            {
                if (token.CsTokenType == CsTokenType.Null)
                {
                    this.AddViolation(parentElement, expression.LineNumber, "DoNotAssignStringsToNull");
                    break;
                }
            }
        }
    }
}
请注意,此代码还验证在声明变量时是否显式分配了变量

我在检查声明后被赋值为null的字符串变量时遇到问题,StyleCopAPI似乎没有公开任何机制来在赋值语句的左侧查找变量的类型

因此,此代码触发了我刚才的规则:

String someString = null;
但该代码不:

String someOtherString = String.Empty;
someOtherString = null;

我目前正在使用StyleCop版本4.7.19.0。任何指向正确方向的指示都将受到感激

StyleCop规则旨在强制执行适当的源代码格式标准。他们只对文本形式的源代码感兴趣:标点符号、空格、拼写等。StyleCop规则可以在编译器访问源代码之前访问源代码。在某些方面这是好的,因为它允许StyleCop强制执行对编译器没有意义的事情,例如大括号、逗号或空格的位置、名称空间的顺序或注释的存在

然而,您所要求的是一种更深入的分析形式,能够理解标记的语义,并且能够跟踪给定标记在代码中的含义。这是静态代码分析的领域,以前称为FxCop,它发生在编译器将源代码处理成IL之后。静态代码分析了解语言元素:类型、运算符、标识符等。它可以执行程序流分析、类型验证和其他操作,这些操作依赖于已经将源代码文本处理为语言元素的编译器

在这种情况下,您试图问的问题是:

是否存在为System.String类型的标识符分配空值的实例


这个问题需要知道每个标识符的类型,并且能够在流程通过函数时遵循该类型。这是一个代码分析规则,而不是样式规则,因此您需要构建一个自定义CA规则来处理它。

StyleCop规则旨在强制执行正确的源代码格式标准。他们只对文本形式的源代码感兴趣:标点符号、空格、拼写等。StyleCop规则可以在编译器访问源代码之前访问源代码。在某些方面这是好的,因为它允许StyleCop强制执行对编译器没有意义的事情,例如大括号、逗号或空格的位置、名称空间的顺序或注释的存在

然而,您所要求的是一种更深入的分析形式,能够理解标记的语义,并且能够跟踪给定标记在代码中的含义。这是静态代码分析的领域,以前称为FxCop,它发生在编译器将源代码处理成IL之后。静态代码分析了解语言元素:类型、运算符、标识符等。它可以执行程序流分析、类型验证和其他操作,这些操作依赖于已经将源代码文本处理为语言元素的编译器

在这种情况下,您试图问的问题是:

是否存在为System.String类型的标识符分配空值的实例


这个问题需要知道每个标识符的类型,并且能够在流程通过函数时遵循该类型。这是一个代码分析规则,而不是样式规则,因此您需要构建一个自定义CA规则来处理它。

这实际上不是一个StyleCop规则;这似乎更像是FxCop规则。很好的观点。。。我还没有真正开始看FxCop的定制,今天下午我会看一看。@MichaelEdenfield-非常感谢,FxCop规则起了作用…很高兴知道。我将为其他可能有类似问题的人添加一个解释差异的答案;这似乎更像是FxCop规则。很好的观点。。。我还没有真正开始看FxCop的定制,今天下午我会看一看。@MichaelEdenfield-非常感谢,FxCop规则起了作用…很高兴知道。我将为其他可能有类似问题的人添加一个解释差异的答案。