我正在编写自定义 StyleCop 规则以防止String
分配变量null
,但遇到了问题!
我可以使用以下代码轻松防止在声明期间String
分配变量: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;
}
}
}
}
}
(请注意,此代码还验证变量在声明时是否已显式分配)。
我在检查声明后String
分配的变量时遇到问题null
,StyleCop API 似乎没有公开任何机制来查找赋值语句左侧的变量类型。
因此,这段代码触发了我刚才的规则:
String someString = null;
但是这段代码没有:
String someOtherString = String.Empty;
someOtherString = null;
我目前使用的是 StyleCop 版本 4.7.19.0。任何正确方向的指示将不胜感激!