咨询区
-
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 去查看源码,这样你会很快的熟悉底层框架。