在今天的上一个问题中,这两种不同的方法被作为答案提出问题.
我们有一个可能会或可能不会实现的对象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,finally和Dispose电话.
Jon*_*eet 12
我对铸造的经验法则:
as,就像你的第二种情况一样as可空类型(为了一致性)或使用is和直接投射请注意,您的第二个表单不会创建"新的中间对象".它创建了一个新的中间变量.那么你的第一种方法是否真的 - 只是变量被编译器有效地隐藏了.它仍然作为堆栈位置存在于IL中,但它在源代码中没有任何表示.
说完所有这些,在这个特殊情况下(你只想处理),Darin的方法是最好的,我相信.