咨询区
-
Aman:
请问 C# 中的 is 和 as 到底有什么区别?.
回答区
-
Guffa:
-
is
is操作符主要是判断一个对象是否可以转换为特定的类型,举个例子:
if (someObject is StringBuilder) ...
-
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 代码。

从图中可以看到: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 去查看源码,这样你会很快的熟悉底层框架。