如果is运算符返回true,则as运算符的结果是否为null?

时间:2014-11-17 19:43:44

标签: c# casting

我正在使用代码质量工具,他们说我可以在第3行使用以下块样式的null deference:

1    if(var1 is Type1)
2    {
3         (var1 as Type1).methodCall();
4    }

它消除了做出以下改变:

1    Type1 tempVar = var1 as Type1; 
2    if(tempVar != null)
3    {
4         tempVar.methodCall();
5    }

这如何改变null deference异常的可能性?根据msdn,如果“提供的表达式为非null,则返回true,并且可以将提供的对象强制转换为提供的类型,而不会引发异常。” (http://msdn.microsoft.com/en-us/library/scekt9xw.aspx

var1 is Type1将评估为True,但var1 as Type1计算结果为null时,会有哪些senerio。或者这是不可能的,只是代码质量工具的限制。

我正在使用jetbrains re-sharper和hp fortify。

2 个答案:

答案 0 :(得分:10)

第一个程序抛出NRE的唯一方法是在检查之后和方法调用之前,var1可能会从另一个线程发生变异。假设您不需要就另一个线程的突变(或已经有适当的同步)协调一致,这是代码分析工具的误报,并且您的原始代码不会抛出NRE。 / p>

答案 1 :(得分:1)

如果另一个线程可以访问var1is,则as的值可能会发生变化。

即使在您的特定情况下不太可能,甚至不可能,建议的代码完全不受此类更改的影响,因此这是一种很好的做法。

建议的代码也只进行一次类型检查,因此它的性能稍好一些。即使性能差异并不总是很重要,但仍然意味着您可以获得更好的代码而无需额外费用。