c# 类的高级技术3--高级转换

类的高级技术3 --------高级转换
主要包括:
1、封箱和拆箱---引用类型和值类型之间的转换
2、is运算符--用于查看变量
3、as运算符---用于把变量转换成指定的类型
  
 ex1:
   
 以这种方式封箱变量而创建的对象,包含值类型变量的一个副本的引用,而不包含源值类型变量的引用。
is运算符:用于查看变量,看它是否为给定的类型或是否与该类型兼容。兼容表示对象是该类型或派生于该类型。is运算符可以检查未知的变量(该变量可能用作对象参数,传送给一个方法)是否可以转换为给定的类型,可以则返回true。
<operand> is <type>
一、如果<type>是一个类,而<operand>也是该类型,或者继承了该类型,或者它封箱到该类型中,则结果为true。
二、如果<type>是一个接口类型,而<operand>也是该类型,或者它是执行了该接口的类型,则结果为true
三、如果<type>是一个值类型,而<operand>也是该类型,或者它被拆箱到该类型中,则结果为true


has运算符

as运算符:用于把变量转换为指定的类型,用于执行引用类型的显示类型转换,这与数据转换略有不同。作用是检查operand以前是否为type类型,是则得到该对象的引用,不是,则返回null。如果兼容就成功转换,如果不兼容,就返回null。它允许在一个步骤中进行安全的类型转换,而不需要先使用is运算符测试类型,再执行转换。
<operand> as <type>
一、<operand>的类型是<type>类型
二、<operand>可以隐式转换为<type>类型
三、<operand>可以封箱到类型<type>中

在程序中,进行类型转换是常见的事。那么在C#中支持以前语言的类型转换方法,即用类型名进行强行转换,例如:

object objTest = new NewType();

NewType newValue = (NewType)objTest;

 

但是这样转换,有个严重的问题,就是在把objTest强转换成NewType类型对象的时候,这个过程是不安全的,因此需要用try-catch语句来进行保护。这样一来,比较安全的代码方式应该如下所示。
   

但是如上的写法在C#中已经属于过时的写法,而且也属于比较低效的写法。在C#中比较高效而且安全的写法,应该用as操作符,那么完成如上类似功能的正确代码应该如下。
    object objTest = new NewType();
 NewType newValue = objTest as NewType;

那么很明显,如上的写法首先看起来很简便,至少代码数量和强转方式一样。至于安全性,对于as操作符来说,它不会做过的转换操作,当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候,那么此转换操作才能成功,而且并不产生新的对象。因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的,因为用as操作符进行转换就如前面所说的,首先判断当前对象的类型,当类型满足要求后才进行转换。而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,这就决定了它的效率不会高于as操作符的效率。

要注意的时候,不管用传统方式,还是用as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:
    

但是,使用as操作符有如下几点限制。

第一个就是,不用在类型之间进行类型转化,即如下编写就会出现编译错误。

NewType newValue = new NewType();

NewType1 newValue = newValue as NewType1;

 

第二个就是,不能应用在值类型数据,即不能如下写(也会出现编译错误)。

    

对于第一点所提的,可以用传统的类型转换方式来完成,但是光用如下的方式,是不能正确完成。

    

但是光如上写是不能完成的,要想使如上的操作能正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码。

   对于第二点所提的,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,那么要完成如上操作,正确的写法如下。

     

 

除了如上两点限制外,在用as操作符来进行类型转换的时候,有个细微的问题。在前面所说的,用as来进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目标类型的派生类型,那么这样就有个问题,即用as操作符来进行类型转换的时候无法转换成正确的类型,也就是说本来应该转换成子类型,却转换成了父类型。但是我并不认为这是个严重问题,因为在用as操作符来进行类型转换的时候,如何选择目标类型在编码的时候已经很明确了,即用父类型作为目标类型,那么类型转换的目的就是转换成父类型对象进行操作;反之亦然。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值