在C#中使用“is”或“as”更好吗?

时间:2014-02-24 15:21:22

标签: c# .net typechecking

是否有一个好的(技术)参数可以使用以下两种方法而不是另一种方法来检查实例是否属于特定类型?其中一个是否容易出错并且应该避免?

// Use "is".
bool isFolder = this.Parent is FolderEntity;

// Use "as".
bool isFolder = (this.Parent as FolderEntity) != null;

代码的目的是找出实例是FolderEntity。在这种情况下,代码将分支。代码对结果对象感兴趣。

从清晰的代码来看,我会使用“是”。然而,我想知道是否有理由更喜欢“as”这样做的方式。

2 个答案:

答案 0 :(得分:4)

如果您只对某种类型的 感兴趣,并且您不需要该对象作为该类型的对象,那么只需使用{{ 1}}。这样,你清楚地表达了你打算检查其类型的意图,而不是将其转换为另一种完全不同意图的类型。

这与actual implementation无关,两者都在某种程度上相互实现。

但是当你可以选择以明确的方式写出符合你意图的东西时,实现细节很少是重要的(并且微优化更有害)。


正如你自己所说,“代码对结果对象不感兴趣,因此你不需要将它转换为另一种类型;你只需要检查它的类型:是的,让代码清楚,只需使用is

另一方面,如果你想检查它的类型但是也要用它做一些事情,你会这样做:

is

答案 1 :(得分:1)

C#中的运算符用于检查对象类型并返回bool值:如果对象类型相同则为true,否则为false。

对于null对象,它返回false。

as 运算符与运算符的作用相同,但区别在于bool,如果它们与该类型兼容,则返回该对象,否则返回null。

如果运算符,要输入强制转换,我们需要执行两个步骤:

  1. 使用
  2. 检查类型
  3. 如果是,则输入
  4. 实际上,这会影响性能,因为CLR每次都会遍历继承层次结构,并根据指定的类型检查每个基本类型。要避免这种情况,请使用作为,只需一步即可完成。仅用于检查类型我们应该使用is运算符。