在 C# 中使用 "is" 还是"as"更好?



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

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

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

从代码清晰的角度来看,我会使用"is"。然而,我想知道是否有理由更喜欢"as"的方式。

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

这与它的实际实现无关,两者在某种程度上是相互实现的。

但是,当您可以选择以明确的方式编写符合您意图的内容时,实现细节很少是重要的(微观优化更有害)。


正如您自己所说,"代码对生成的对象不感兴趣">,所以您不需要将其转换为另一种类型;您只需要检查它的类型:所以,是的,让代码清楚地了解这一点,只需使用is

另一方面,如果你想检查它的类型,但也要对它做些什么,你会这样做:

FolderEntity folder = this.Parent as FolderEntity;
if (folder != null)
DoThingsWith(folder);
else
DoThingsWithoutTheParent();

C#中的is运算符用于检查对象类型,并返回布尔值:如果对象是同一类型,则返回true;如果不是,则返回false。

对于null对象,它返回false。

as运算符执行与is运算符相同的操作,但不同之处在于它不是bool,而是返回对象(如果它们与该类型兼容),否则返回null。

运算符的情况下,要键入cast,我们需要执行两个步骤:

  1. 使用检查类型是
  2. 如果是真的,则键入cast

实际上,这会影响性能,因为每次CLR都会遍历继承层次结构,根据指定的类型检查每个基类型。要避免这种情况,请使用,因为只需一步即可完成。只有在检查类型时,我们才应该使用is运算符。

最新更新