0

经过一些关于“空取消引用”的测试后,下面的代码可以“取消引用空指针,从而引发 NullException”。

if((validateControl as WebControl) != null)
    (validateControl as WebControl).CssClass (IsValid) ? "stack" : "overflow";

(validateControl as WebControl).CssClass 可以在上面使用时为空吗?

结果可在 Fortify 生成的文档中看到。

4

3 回答 3

10

false当它不是 a 时得到WebControltrue否则:

bool isWebControl = validateControl is WebControl;

null当它不是 a 时得到WebControlWebControl否则得到:

WebControl webControl = validateControl as WebControl;

可以(validateControl as WebControl)为空吗?

是的,每次使用时as,理论上结果可能为空。代码分析工具看不到您刚刚检查它是否不为空,并且仍会假设下一次使用的as可能为空。所以你应该把它放在一个变量中并使用它来代替:

WebControl webControl = validateControl as WebControl;
if (webControl != null)
{
    // Here 'webControl' is surely _not_ null.
    webControl.CssClass = Page.IsValid ? "stack" : "overflow";
}

可以(validateControl as WebControl).CssClass为空吗?

您从中获得的值CssClass可能为空。但是既然CssClass是一个属性,那么只要是一个属性,这个属性就会一直validateControl存在WebControl

于 2013-04-23T12:33:46.097 回答
2

如何重新格式化您的代码以更明确。

var webControl = validateControl as WebControl;
if(webControl != null)
{
    var cssClass = IsValid ? "stack" : "overflow";
    webControl.CssClass = cssClass;
}
于 2013-04-23T12:32:12.047 回答
0

是的,它可以。如果它很重要,一旦您知道 validateControl 不为 null 并且是 WebControl,那么您可以测试 CssClass 的可空性和可能为空或只是空格,具体取决于“有效”的含义

于 2013-04-23T12:33:13.140 回答