NET基础:is 和 as 操作符

Posted sunyj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NET基础:is 和 as 操作符相关的知识,希望对你有一定的参考价值。

  在C#语言中进行类型转换的另外一种方式是使用is和as操作符。is检查对象是否兼容于指定类型,返回Boolean值true或false。注意,is操作符永远不抛出异常,例如以下代码:

Object o = new Object();

Boolean b1 = (o is Object);    //返回true
Boolean b2 = (o is Employee);    //返回false

  如果对象引用null,is操作符总是返回false,因为没有可以检查其类型的对象。

is操作符通常像下面这样使用:

if(o is Employee)
{
    Employee e = (Employee)o;
}

  在上述代码中,CLR实际检查两次对象类型。is操作符首先核实o是否兼容于Employee类型,如果是,在if语句块内进行类型转换,CLR再次核实o是否引用一个Employee。CLR的类型检测增加了安全性,但无疑会对性能造成一些损失。这是因为CLR首先必须判断变量o引用的对象的实际类型。然后,CLR必须遍历继承层次结构,用每个基类型去核对指定的类型(Employee)。由于这是一个相当常用的编程模式,所以c#专门提供了as操作符,目的就是简化这种代码的写法,同时提升其性能。

Employee e = o as Employee;
if(e != null)
{
     //在if中使用e
}

  在这段代码中,CLR核实o是否兼容于Employee类型;如果是,as返回对同一个对象的非null引用。如果o不兼容与Employee类型,as 返回null。注意,as操作符造成CLR只检验一次对象类型。if语句只检测e是否为null;这个检查速度比检验对象的类型要快的多。

     as 操作符的工作方式与强制类型转换一样,只是它永远不会抛出异常,如果对象不能转型,结果就是null。所以,正确做法是检查最终生成的引用是否为null。

以上是关于NET基础:is 和 as 操作符的主要内容,如果未能解决你的问题,请参考以下文章

swift--使用 is 和 as 操作符来实现类型检查和转换

继承(is与as)

c# as/is操作符

spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)(代码片段

is 和 as 运算符

[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段