1

“is”运算符在 C# 中如何工作?

我被告知这是:

if (x is string)
{
     string y = x as string;
     //Do something
}

不如这个:

string y = x as string;
if (y != null)
{
     //Do something
}

哪个更好?为什么?

4

3 回答 3

2

FxCop 在第一种情况下发出警告 CA1800(不仅在使用 时as,而且在使用未经检查的强制转换时),因为两者is和实际强制转换都需要某些类型检查操作来确定强制转换是否成功或是否抛出InvalidCastException.

as您可以通过只使用一次然后检查结果是否仍要使用强制转换值来节省一些操作null,而不是显式检查is然后重新强制转换。

于 2013-10-31T10:44:38.140 回答
1

我认为第二个更好,因为在第一种情况下它将投射对象 2 次,第一次使用 is 运算符,第二次使用 as 运算符。

而在第二种情况下,它只施放一次。

is 运算符检查对象是否可以转换为特定类型

    if (someObj is StringBuilder)
{
StringBuilder ss = someObj as StringBuilder
....
}

as 运算符将对象转换为特定类型,如果失败则返回 null。

StringBuilder b = someObj as StringBuilder;
if (b != null) ...
于 2013-10-31T10:47:02.760 回答
0

当预期将多个类型存储在 x 中时,我将使用第一种方法。(您可能会收到一个字符串或 StringBuilder 等)。这将允许基于非异常的处理。

如果您总是期望 x 持有某种类型的值,那么我会使用第二个选项。对 null 的检查成本低廉,并且提供了一定程度的验证。

- 编辑 -

哇。在阅读了下面的一些评论后,我开始寻找更多更新的信息。在使用 as vs is vs (casting) 时,还有很多需要考虑的因素。这是我发现的两个有趣的读物。

即使没有空检查,使用“as”而不是强制转换是否有意义?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

于 2013-10-31T10:53:14.807 回答