“是”运算符如何在C#中工作?
我被告知这个:
if (x is string)
{
string y = x as string;
//Do something
}
不如此:
string y = x as string;
if (y != null)
{
//Do something
}
哪个更好,为什么?
答案 0 :(得分:2)
FxCop在第一个方案中{并且不仅在使用as
时,而且在Warning CA1800时)when using an unchecked cast,因为is
和实际的强制转换需要某些类型检查操作确定演员表是否成功或是否抛出InvalidCastException
。
您可以只使用as
一次保存一些操作,然后检查null
的结果,如果您要使用转换值,而不是使用is
明确检查然后重新铸造。
答案 1 :(得分:1)
我认为第二种情况更好的原因在第一种情况下它会将对象转换为2次,第一次使用is运算符,第二次使用as运算符。
而在第二种情况下它只投了一次。
is运算符检查对象是否可以转换为特定类型
像
if (someObj is StringBuilder)
{
StringBuilder ss = someObj as StringBuilder
....
}
as运算符将对象强制转换为特定类型,如果失败则返回null。
像
StringBuilder b = someObj as StringBuilder;
if (b != null) ...
答案 2 :(得分:0)
当多个类型期望存储在x中时,我会使用第一种方法。 (您可能会传递一个字符串,或一个StringBuilder等)。这将允许基于非异常的处理。
如果你总是期望x保持某种类型的值,那么我会使用第二种选择。检查null是否便宜并且提供了一定程度的验证。
- 编辑 -
哇。在阅读下面的一些评论后,我开始寻找更多更新的信息。当使用vs vs vs(cast)时,还有很多需要考虑的问题。以下是我发现的两个有趣的读物。
Does it make sense to use "as" instead of a cast even if there is no null check?和http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx?PageIndex=1#comments
Jon Skeet的博客似乎总结了这两点。 http://www.yoda.arachsys.com/csharp/faq/#cast.as