『框架设计(第2版)CLR Via C#』学习笔记——使用is和as操作符来进行强制类型转换
is操作符是检查一个对象是不是兼容于指定的类型,并返回一个Boolean值:true或false。因此is操作符永远不会抛出异常。
例如如下代码:
那么as是用来干吗的哪?还是让我们先来看一段代码吧:
这里CLR的类型检查增强了安全性,但是同时也无疑会对性能造成一定的影响,因为CLR首先必须判断变量o引用的对象是实际的对象,然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型Student。
正是因为这是一个非常常用的功能,所以C#专门的提供了一个as操作符,目的就是为了简化这种代码的编写,同时提升性能。
例如如下代码:
1
Object o = new Object();
2
Boolean b1 = (o is Object); //b1 is true
3
Boolean b2 = (o is Student); //b2 is false
如果对象是null引用,则总是返回false。![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
那么as是用来干吗的哪?还是让我们先来看一段代码吧:
1
if (o is Student)
2
{
3
Student s = (Student)o;
4
// do rest things
5
}
在上段代码中,CLR实际上会检查两次对象的类型。第一次是is操作符核实o是否兼容于Student类型。如果答案是肯定的,那么进入if内部,执行第一句就出现类型转化,这时CLR再次核实o是否引用了一个Student。![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这里CLR的类型检查增强了安全性,但是同时也无疑会对性能造成一定的影响,因为CLR首先必须判断变量o引用的对象是实际的对象,然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型Student。
正是因为这是一个非常常用的功能,所以C#专门的提供了一个as操作符,目的就是为了简化这种代码的编写,同时提升性能。
1
Student s = o as Student;
2
if (s != null)
3
{
4
// do rest things
5
}
这里就只检查了一次,CLR核实o是否兼容于Student类型,如果是,则返回对同一个对象的一个非null的引用。如果不兼容于Student类型,as操作符就会返回null。这里需要说明一下if语句只是检查s是否为null,这个过程相较于校验对象的类型,这个检查能更快的执行。![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)