as 与 is 的区别
2015-09-11 10:54
357 查看
is就是处于对类型的判断。返回true和false。如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。另外is操作符永远不会抛出异常。
代码如下:
System.Boolean b1 = (o is System.Object);//b1 为true
System.Boolean b2 = (o is Employee);//b2为false
如果对象引用为null,那么is操作符总是返回为false,因为没有对象可以检查其类型,就像下面代码一样
if(o is Employee) {
Employee e = (Employee) o;
//在if语句中使用e
}
在上面代码中,其实clr对对象类型检查了两次:is操作首先检查o所引用的对象是否和employee类型兼容。如果兼容,那么在if语句内clr在执行转换时又会检查o是否为一个Employee引用。这种编程范式十分常见,c#便提供了一种新的类型检查,转换方式。即as操作符,他可以在简化代码的同时,提高性能。代码如下:
Employee e = o as Employee;
if(e != null)
{
//在if语句中使用e
}
这种as操作即便等同于上面代码,同时只进行了1次的类型检查,所以提高了性能。如果类型相同就返回一个非空的引用,否则就返回一个空引用。
那么这个时候我们就很清楚的就知道什么时候该用is,什么时该用as了:如果我们测试对象的目的是确定它是否属于所需类型,并且若是的话就要立即转换,这种情况下as操作符效率更好,但有时我们只是测试并不想立即转换,可能根本就不会转换,只是在对象实现了接口时,要将它加到一个列表中,这是is操作符就是一个更好的选择。
代码如下:
System.Boolean b1 = (o is System.Object);//b1 为true
System.Boolean b2 = (o is Employee);//b2为false
如果对象引用为null,那么is操作符总是返回为false,因为没有对象可以检查其类型,就像下面代码一样
if(o is Employee) {
Employee e = (Employee) o;
//在if语句中使用e
}
在上面代码中,其实clr对对象类型检查了两次:is操作首先检查o所引用的对象是否和employee类型兼容。如果兼容,那么在if语句内clr在执行转换时又会检查o是否为一个Employee引用。这种编程范式十分常见,c#便提供了一种新的类型检查,转换方式。即as操作符,他可以在简化代码的同时,提高性能。代码如下:
Employee e = o as Employee;
if(e != null)
{
//在if语句中使用e
}
这种as操作即便等同于上面代码,同时只进行了1次的类型检查,所以提高了性能。如果类型相同就返回一个非空的引用,否则就返回一个空引用。
那么这个时候我们就很清楚的就知道什么时候该用is,什么时该用as了:如果我们测试对象的目的是确定它是否属于所需类型,并且若是的话就要立即转换,这种情况下as操作符效率更好,但有时我们只是测试并不想立即转换,可能根本就不会转换,只是在对象实现了接口时,要将它加到一个列表中,这是is操作符就是一个更好的选择。
相关文章推荐
- Android第四十八期 - SwipeMenuListView
- Android第四十八期 - SwipeMenuListView
- Eclipse在搜索的时候,遇到Resource is out of sync with the file system的问题
- Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)
- android如何保存相册后显示
- java实体转map工具类
- log4j.properties
- RecyclerView自适应高度的LayoutManager
- 设计模式之-模板方法模式
- linux 识别localhost 修改/etc/hosts
- sqlserver2008日志压缩
- Linux FTP 服务器配置简单说明【从防火墙关闭到关闭selinux-sestatus到配置ftp用户访问的数据目录再到添加一个ftp用户】
- jsp文本框传汉字乱码问题
- Javascript 原生 全选 反选 不选 实战练习
- 利Android AQuery中ajax访问SSH搭建的后台Java Web服务器
- oracle like 索引问题
- express框架不重启刷新内容小问题
- 第二天:安装VMware和linux系统(1)
- Qt 为自己的程序建立一个消息循环
- 一元运算符+