注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Big鹏 ——学无止境

不谋万世者,不足谋一时;不谋全局者,不足谋一域

 
 
 

日志

 
 

C#类型转换之is和as操作  

2014-10-29 23:58:08|  分类: 小技能 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1.类型转换基础

CLR最重要的特征之一就是类型安全,在运行时它总是知道一个对象是什么类型。调用GetType方法就可知道一个对象的确切类型是什么。由于是非虚方法,所以一个类型不能重写该方法从而伪装为另一个类型。

CLR允许将一个对象转换为它的实际(确切)类型或者它的任何基类型,C#将一个对象向它的基类型的转化认为是一种安全的隐式转换,不需要特殊语法;而将一个对象转换为它的派生类型时,C#要求开发人员只能显示转换(否则不能通过编译),因为这样的转换可能在运行时失败。实例如下:

class Employee
{

}

internal class Manager:Employee
{

}
class Program
{
static void Main(string[] args)
{
//编译成功、运行成功
Manager m = new Manager(); //因为m属于object类型,所以编译成功
PromoteEmployee(m);//因为m属于Employee类型,所以运行成功

//编译成功、运行失败
DateTime dt = DateTime.Now;//因为m属于object类型,所以编译成功
PromoteEmployee(dt);//因为dt不属于Employee类型,所以运行失败
}
public static void PromoteEmployee(object o)
{
//Employee e2 = o;将对象转换为派生类类型必须显示转换,此处会报错
Employee e = (Employee)o;
}
}


2. Is操作

       首先,一个类与它本身以及所有它的基类的类型都是兼容的。is操作检查一个对象是否兼容于指定的类型,并返回一个Boolean值。但是,is操作符永远不会抛出异常,如:

Object o = new object();
Boolean b1 = (o is object); //b1为true
Boolean b2 = (o is Employee);//b2为false

       如果对象引用为nullis操作符总是返回false,因为没有可检查类型的对象。使用方法如下:

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

3. as操作

       为了将o转为Employee类型,上面这段代码实际会检查两次对象类型,首先确定o是否兼容于Employee类型,如果是,那么if内部类型转换时还要判断o是否引用一个Employee

       这样使用is操作符在简化类型转换(增加安全性)写法的同时,对性能也造成一定的影响,CLR必须首先确定o引用对象的实际类型,然后遍历类的继承层次结构,用每个基类型去核对指定的类型(Employee)。

       由于类型转换非常常用,所以C#专门提供了as操作符,as操作符既简化类型转换代码的写法,又能提升性能,所以是公司中很常用的写法。如下:

Employee e = o as Employee;
if (e!=null)
{
//-------
}

       这段代码中,CLR核实o是否兼容于Employee类型,如果是,as会返回目标类型的非null引用,不兼容则会返回null。上面的代码使CLR只会检查一次对象的类型。if语句只是检查e是否为null,这个检查的速度远快于校验对象的类型。

       as操作符的原理与强制类型转换原理一样,只是,如果对象不能转换,它就会返回一个null,而永远不会抛出异常,所以使用时只需检查最终生成的引用是否为null即可。如果不检查返回值(if (e!=null))直接使用,当返回值为null时就会返回空引用异常。例:

Object o = new object();
Employee e = o as Employee;//转换会失败,但不会抛出异常,但e会被设为null

e.ToString();//访问e会抛出一个NullReferenceException

4. 总结

一个类与它本身以及所有它的基类的类型都是兼容的,当被转对象转为它的兼容类型时不需要强制(显示)转换,否则需要强制转换。进行类型转换时,CLR必须首先确定被转对象的实际类型,然后遍历类的继承层次结构,用每个基类型去核对指定的类型。类型转换,实际运用中as操作符最常用。

  评论这张
 
阅读(160)| 评论(11)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017