【发布时间】:2014-11-17 19:43:43
【问题描述】:
我正在使用代码质量工具,他们说我可以在第 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 }
这将如何改变可能出现 null 尊重异常的情况?根据 msdn,如果“提供的表达式不为空,并且提供的对象可以转换为提供的类型而不会引发异常”,则将返回 true。 (http://msdn.microsoft.com/en-us/library/scekt9xw.aspx)
var1 is Type1 的计算结果为 True,但 var1 as Type1 的计算结果为 null。或者这是不可能的,只是代码质量工具的限制。
我正在使用 jetbrains re-sharper 和 hp fortify。
【问题讨论】:
-
请注意,第二个代码还修复了某些工具发出的“避免重复调用
as”警告,因此您可能只想坚持下去。 -
除了下面的 servy 回答之外,还有一个(有点理论上的)性能问题。在内部,
is和as运算符在做同样的事情(对于引用类型),那么为什么要这样做两次呢? (编辑:就像阿列克谢刚才说的一样) -
@KrisVandermotten 不过,这在很大程度上是一个微优化。这根本不是一项昂贵的手术。
-
性能这件事是一个因素,一个小因素。我确实喜欢它的可读性,但很多时候在 if else if ... 中有多个 var is 类型调用会阻塞并使它变得丑陋。
-
@Servy 就像我说的,有点理论上的性能问题。在实践中,它几乎不会被检测到,即使在一个紧密的循环中也是如此。