之前一直以为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和强制类型转换原理是不一样的,前者适用于存在继承关系的对象中,针对的是运行时类型,后者执行自定义转换函数,针对的是编译时类型。

as和强制类型转换的区别的更多相关文章

  1. c# 优化代码的一些规则——使用is或as和强制类型转换的区别[三]

    前言 使用as和强制类型转换的时候的区别是否仅仅是代码形式上的区别. 答案是肯定不是的. 正文 看两段代码: object o = Factory.GetObject(); Student stude ...

  2. c#中convert.toInt32和int.parse()和强制类型转换的区别

    string a="123"; int i=(int)a; 这是会出现错误因为:强制类型转换只能转换值类型不能转换引用类型 string属于引用类型    强制类型转换时如果值类型 ...

  3. static_cast、dynamic_cast、reinterpret_cast、const_cast以及C强制类型转换的区别

    static_cast 1. 基础类型之间互转.如:float转成int.int转成unsigned int等 2. 指针与void*之间互转.如:float*转成void*.CBase*转成void ...

  4. C语言与C++语言的强制类型转换格式区别

    C语言:(类型)(表达式),其中类型的括号()必须带. C++语言:(类型)(表达式),其中类型的括号()跟进表达式选带.

  5. 数据类型/强制类型转换 和运算符---标识符规则/关键字 a++和++a区别

    3.2关键字都是小写,TRUE FALSE NULL都不是Java关键字 3.3数据类型 变量相当于一个有名称的容器,该容器用于装各种不同类型的数据 Java类型分为2种 基本类型: 引用类型: 基本 ...

  6. C#中的强制类型转换与as转换的区别

    C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA();  ClassB b = new ClassB(); 如果 ...

  7. C++里的强制类型转换符reinterpret_cast、static_cast 、dynamic_cast、const_cast 区别

    C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...

  8. c与c++中的强制类型转换区别

    强制类型转换的一般形式为: (类型名)(表达式) 如:(int)a.这是C语言使用的形式,C++把它保留了下来,以利于兼容. C++还增加了以下形式: 类型名(表达式) 如:int(a).这种形式类似 ...

  9. 强制类型转换(int)、(int&)和(int*)的区别

    我们先来看两行代码: float x=1.75,y=1.75; cout<<(int)x<<" "<<(int&)y<<en ...

随机推荐

  1. JavaScript—面向对象贪吃蛇_1

    前面说了.面向对象的思考方式和面向过程的思考方式有着本质的区别. 贪吃蛇.作为各大培训机构.面向对象的练手项目,的确好.我昨天看完视频,有一种领悟面向对象的感觉,当然可能只针对贪吃蛇..要想在实际开发 ...

  2. 洛谷 P1032 字串变换(map)

    题目传送门 解题思路: 搜索题,因为要求最少次数,用bfs. AC代码: #include<cstdio> #include<iostream> #include<cst ...

  3. POJ 2976 Dropping tests【0/1分数规划模板】

    传送门:http://poj.org/problem?id=2976 题意:给出组和,去掉对数据,使得的总和除以的总和最大. 思路:0/1分数规划 设,则(其中等于0或1) 开始假设使得上式成立,将从 ...

  4. Spring(一)——IOC和DI的简单理解

    Spring是一个IOC(DI)和AOP容器框架,并且是开源的. 1.IOC和DI 比较官方的说法: •IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找 ...

  5. 写一个读取Excel表格的接口

    # -*- coding: gbk -*-import xlrd class Canshu: def __init__(self,filepath): """ 创建文件对 ...

  6. BSC软件交流-BS

    管理体系的提升公司.部门 关键指标 体系EXCEL记录的方式 较老,不够系统化BSC模式 测评.咨询.绩效软件目标地图 ,任务 目标 分解 平台?手机端? 集成 钉钉? paas平台?基础数据的获取团 ...

  7. Codeforces Round #555 (Div. 3) B. Long Number 【仔细读题】

    B. Long Number time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  8. Java 创建类的过程

    创建对象过程: 堆分配父类空间 堆分类子类空间 属性初始化 调用构造方法(第一行是调用父类构造方法)

  9. 安装R的h5包

    系统 redhat7 安装H5的包, 依赖系统hdf5包,如下安装完, 发现版本不一致, sudo yum install hdf5-devel 解决办法: 移花接木 sudo ln -s /opt/ ...

  10. [原]PInvoke导致栈破坏

    原, 总结, 调试, 调试案例  项目中遇到一个诡异的问题,程序在升级到.net4.6.1后会崩溃,提示访问只读内存区.大概现象如下: debug版不崩溃,release版稳定崩溃. 只有x64位的程 ...