为什么瑞沙珀更喜欢“原样”而不是“原样”?


13

当我编写这样的代码时,其中obj是局部变量:

if (obj is IMyInterface)
{
   var result = (IMyInterface)obj;
   // ....
}

Resharper提议将其更改为如下代码:

var result = obj as IMyInterface;
if (result != null)
{
   // ...
}

我更喜欢前者,因为它没有提供偶然的空引用异常的机会。有什么理由偏爱其他形式?

为什么Resharper建议这样做?

Answers:


25

首先看一下乔恩·斯基特(Jon Skeet)有关C#转换的一般问题的答案

不要这样做:

if (randomObject is TargetType)
{
    TargetType foo = (TargetType) randomObject;
    // Do something with foo
}

如果randomObject是字段而不是局部变量,则不仅检查两次,而且还可能检查其他内容。如果另一个线程在两者之间更改了randomObject的值,则“ if”可能会传递,但强制转换会失败。

(...)

如果randomObject可能是TargetType的实例,而TargetType是引用类型,则使用如下代码:

TargetType convertedRandomObject = randomObject as TargetType;
if (convertedRandomObject != null)
{
    // Do stuff with convertedRandomObject
}

然后看到类似的主题:


1
+1另请参阅有关该主题的Eric Lippert的博客文章
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.