使用Cast两次,或者使用一次并创建一个新变量

Øyv*_*hen 6 .net c#

在今天的上一个问题中,这两种不同的方法被作为答案提出问题.

我们有一个可能会或可能不会实现的对象IDisposable.如果是的话,我们想要处理它,如果不是我们什么也不做.这两种不同的方法是:

1)

if(toDispose is IDisposable)
  (toDispose as IDisposable).Dispose();
Run Code Online (Sandbox Code Playgroud)

2)

IDisposable disposable = toDispose as IDisposable;
if( disposable != null )
  disposable.Dispose();
Run Code Online (Sandbox Code Playgroud)

主要是,从评论中可以看出,共识是2)是最好的方法.

但看看差异,我们归结为:

1)在toDispose上执行两次强制转换.

2)仅执行一次转换,但创建一个新的中间对象.

我猜测2会慢一点因为它必须分配一个新的局部变量,所以为什么这被认为是这种情况下的最佳解决方案?这完全是因为可读性问题?

Dar*_*rov 13

不是真的回答你的问题,但我建议你这个结构:

using (toDispose as IDisposable)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

并让有关的编译器担心ifs,finallyDispose电话.


Jon*_*eet 12

我对铸造的经验法则:

  • 如果该值不是正确类型的错误/错误,则只需投射
  • 否则使用as,就像你的第二种情况一样
  • 如果您正在处理值类型,您可以使用as可空类型(为了一致性)或使用is和直接投射

请注意,您的第二个表单不会创建"新的中间对象".它创建了一个新的中间变量.那么你的第一种方法是否真的 - 只是变量被编译器有效地隐藏了.它仍然作为堆栈位置存在于IL中,但它在源代码中没有任何表示.

说完所有这些,在这个特殊情况下(你只想处理),Darin的方法是最好的,我相信.