C#中IS 和 AS 关键词到底有什么不同?

咨询区

  • Aman

请问 C# 中的 is 和 as 到底有什么区别?.

回答区

  • Guffa
  1. is

is操作符主要是判断一个对象是否可以转换为特定的类型,举个例子:

if (someObject is StringBuilder) ...
  1. as

as操作符它会尝试将一个对象转为特定的类型,如果转换失败则返回 null,举个例子:

StringBuilder b = someObject as StringBuilder;
if (b != null)
{
}

说到这里,我不得不提下 casting,它是强制将一个对象转为特定类型,如果失败则抛出异常, 举个例子:

StringBuilder b = (StringBuilder)someObject.
  • Abhilash NK

is 和 as 都常用于 C# 中的类型转换,如果你会看 IL 代码,我相信你会很容易的看出他们的不同点,比如下面的代码:

BaseClass baseclassInstance = new DerivedClass();
DerivedClass derivedclassInstance;
if (baseclassInstance is DerivedClass)
{
   derivedclassInstance = (DerivedClass)baseclassInstance;
   // do something on derivedclassInstance
}

derivedclassInstance = baseclassInstance as DerivedClass;
if (derivedclassInstance != null)
{
   // do something on derivedclassInstance
}

然后我们看下 IL 代码。

C#中IS 和 AS 关键词到底有什么不同?

 

从图中可以看到:is 包含的 IL代码区有 isinsta 和 castclass, 但 as 关键词的代码区只有一个 isinsta 。

总的来说,如果你对转换结果不关心的话,建议用 is,这样的代码区也就只有一个 isinsta ,比如下面这样。

if (baseclassInstance is DerivedClass)
{
   // do something based on the condition check.
}

is 和 as 还是按需使用。

点评区

其实不管是 is 还是 as ,它都是一种编译器层面的语法糖,大家要多用 ILSpy 或者 DnSpy 去查看源码,这样你会很快的熟悉底层框架。