如果 is 运算符返回 true,则 as 运算符的结果是否可以为 null
本文关键字:运算符 是否 结果是 null 结果 as 返回 is true 如果 | 更新日期: 2023-09-27 18:30:37
我正在使用代码质量工具,他们说我可以在以下块样式的第 3 行上有一个空尊重:
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 }
这如何改变空顺从异常的可能性?根据 msdn 的说法,如果"提供的表达式为非空,并且提供的对象可以强制转换为提供的类型而不会引发异常",则返回 true。(http://msdn.microsoft.com/en-us/library/scekt9xw.aspx)
var1 is Type1
的计算结果为 True,但var1 as Type1
计算结果为 null。或者这是不可能的,只是代码质量工具的限制。
我正在使用喷气脑重新锐利和马力强化。
您的第一个程序可能引发 NRE 的唯一方法是var1
检查后和方法调用之前可能从另一个线程突变。 假设您不需要协调来自另一个线程的突变(或已经有适当的同步),这是代码分析工具的误报,您的原始代码不会抛出 NRE。
如果
另一个线程可以访问var1
的值,则的值可能会在is
和as
之间更改。
即使在您的特定情况下不太可能,甚至不可能,建议的代码也完全不受此类更改的影响,因此这是一种很好的做法。
建议的代码也只执行一次类型检查,因此它的性能甚至略好一些。即使性能差异并不总是显著的,它仍然意味着您可以免费获得更好的代码。