zoukankan      html  css  js  c++  java
  • as和强制类型转换的区别

      之前一直以为as就是强制类型转换,只是as是AS3中新的语法,之前用在有继承关系的对象之间的转换也无甚区别,但是今天却让我领悟到了它俩之间的区别。

    原起:今天要给ColorPicker控件动态赋值,它的selectedColor属性接收的是一个uint属性,而我要从另一个对象中拿过来的属性是String的,理所当然的我写了如下的代码:

    经过:

     

    1. var color:uint = str as uint;//str是String类型,大概是这个样子  

           显然,没有效果,跟踪之后,color是null值,于是换成

     

     

    1. var color:uint = uint(str);  

           这样却好使了,好奇的我google了一下,果然有关于我遇到的问题。

     

           文中是这样说的,作者与我遇到了同样的问题,以下是引用内容,转自http://www.cnblogs.com/Longbin/articles/2064004.html

    以前AS中是这样进行强制类型转换的:假设有一个类叫做Class1,我们声明了一个它的对象 

    c1,如果想要将它转换成Class2类型,只要这样写:

    Class2(c1);

     

    在AS3中你依然可以这样写,但是AS3 中提供了一个新的操作符: as ,并且推荐使用as 
    进行强制转换,上述的例子用 as 操作符实现就是这样:

    c1 as Class2;

    使用 as 操作符有几个好处:

    1.它的效果和第一种方法是一样的。
    2.如果类型不兼容无法转换,就会返回null,而不是出错。这样你就可以自定义错误的时候该做什么。
    3.没有运行时错误(Run Time Error)提示。

    不过有些时候我在使用 as 的时候并不能达到强制转换的目的,在AS3.0类库中最高层类(Top Level classes,所有Top Level 
    classes的列表)之间进行强制转换时, as 操作符是不起作用的。比如,假如你想要将一个String 类型的字符串 str 转换成 
    Number 类型的数字 num 时,可能想要这样写:

    num = str as Number;

    这样写是没有用的,你只能通过第一种方法来达到强制转换的目的:

    num = Number(str);

    PS:如果我们用as来转换的话,除非MyObj1和MyObj2有继承关系,否则转换将失败,而用强制类型转换则不一定,只要MyObj1类有自定义类型转换函数MyObj2,则可能转换成功,因为强制类型转换针对的是编译时类型,而对于编译时类型o1为object类型,并没有自定义转换为MyObj2的函数.
     
    as和强制类型转换的区别在于,as不会在意是否存在自定义类型转换函数,它针对的时运行时类型,所以as转换成功的可能性只有2者具有同一运行时类型,即2者具有相互继承关系;而强制类型转换会执行自定义转换函数,并且它针对的是编译时类型,所以要注意(2)类似的错误.
     
    还有as不能用于Int(float)等值类型.

    我们常用到的foreach用的是强制类型转换,因为它需要能对Int等类型支持.

    is的原理与as类似,不过它返回bool类型,is可与强制类型转换搭配使用,可避免转换异常,但最好不要把is和as搭配,实际上is也做了as的转换操作,这样会影响效率.

    以上是引用内容。

           结论:as和强制类型转换原理是不一样的,前者适用于存在继承关系的对象中,针对的是运行时类型,后者执行自定义转换函数,针对的是编译时类型。

  • 相关阅读:
    在vim中设置将tab自动转化为4个空格
    nginx1.4.6+php5.5.11+mysql5.6.17+mecache+opcache
    Centos7安装杀毒软件ClamAV
    网页中meta标记
    js刷新页面方法大全
    微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法
    phpcms v9 如何实现用户登录
    web页面自适应手机屏幕宽度
    微信公共平台消息回复类
    自动回复微信消息
  • 原文地址:https://www.cnblogs.com/lpbca/p/3278508.html
Copyright © 2011-2022 走看看