is-operator的良好用法是什么?
以下用于强制转换的构造不是推荐的方法,几乎所有文档都优先使用as-operator进行空值检查。
if(obj is SomeClass)
{
SomeClass some = (SomeClass)obj;
....
}
确定这是(非常小的)性能提升,有些甚至提到了胎面安全性。 是的,这是真的......
那么,为什么我们有is-operator?
“带有空检查的操作员”在哪里不起作用或不是可行的方法?
通过使用is-operator来限制您声明的范围是否有优势?
答案 0 :(得分:11)
as
无法使用不可为空的struct
:
object o = 123;
int i = o as int; // compile error
但是:
object o = 123;
if(o is int) {
int i = (int)o;
//...
}
当然,从2.0开始你也可以使用:
int? i = o as int?;
并像往常一样测试null
。
还有 你不关心对象价值的场景......你只需要知道它是什么:
if(obj is Something)
throw new InvalidOperationException("Seriously, don't do that");
// phew! dodged a bullet; we're ok here...
请注意GetType()
不适用于此,因为您不希望手动考虑子类,接口等。