首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ActionScript:有没有一个很好的理由来使用'as‘造型?

ActionScript:有没有一个很好的理由来使用'as‘造型?
EN

Stack Overflow用户
提问于 2009-06-15 14:38:11
回答 4查看 5.6K关注 0票数 18

据我对ActionScript的理解,有两种类型的类型转换:

代码语言:javascript
复制
var bar0:Bar = someObj as Bar;  // "as" casting
var bar1:Bar = Bar(someObj); // "class name" casting (for want of a better name)

另外,如果我说错了,请纠正我,as类型转换将返回类的实例或null,而“类名”类型转换将返回类的实例,或者如果类型转换是不可能的,则引发异常-除此之外,它们是相同的。

然而,考虑到这一点,as强制转换似乎严重违反了失败-快速-失败-早期原则……我很难想象这样一种情况,即使用as强制转换比使用类名强制转换(可能会在其中抛出instanceof )更可取。

所以,我的问题是:在什么情况下使用as造型更可取?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-15 16:17:53

您需要在两种情况下使用as进行转换:转换为Date和转换为Array

对于日期,对Date(xxx)的调用与新Date().toString()的行为相同。

对于数组,调用Array(xxx)将创建一个Array,其中包含一个元素: xxx。

已经证明Class()强制转换方法比as强制转换方法更快,因此当效率很重要时(以及当不使用日期和数组时),它可能比as更可取。

代码语言:javascript
复制
import flash.utils.*;

var d = Date( 1 );

trace( "'" + d, "'is type of: ",getQualifiedClassName( d ) );

var a:Array = Array( d );

trace( "'" + a, "' is type of: ", getQualifiedClassName( a ) );

    //OUTPUT
        //'Mon Jun 15 12:12:14 GMT-0400 2009 'is type of:  String
        //'Mon Jun 15 12:12:14 GMT-0400 2009 ' is type of:  Array

    //COMPILER ERRORS/WARNINGS:
        //Warning: 3575: Date(x) behaves the same as new Date().toString(). 
        //To cast a value to type Date use "x as Date" instead of Date(x).
        //Warning: 1112: Array(x) behaves the same as new Array(x).
        //To cast a value to type Array use the expression x as Array instead of Array(x).

`

票数 12
EN

Stack Overflow用户

发布于 2009-06-15 16:27:51

在这个讨论中有几点值得注意。

两者的工作方式有很大的不同,Class()将尝试将对象强制转换为指定的Class,但如果做不到这一点,将(有时,取决于数据类型)抛出运行时错误。另一方面,使用object as Class将首先执行类型检查,如果指定的对象不能强制转换为指定的Class,则返回空值。

这是一个非常重要的区别,也是开发中的一个有用工具。它允许我们执行以下操作:

代码语言:javascript
复制
var o:MyClass = myArray[i] as MyClass;

if(o)
{
    //do stuff
}

我认为这样做的用处是显而易见的。

"as“也与语言的其余部分更一致(例如:"myObject is MyClass")。

MyClass()方法在处理简单数据类型(int、Number、uint、string)时还有其他优点。下面是一些示例:

代码语言:javascript
复制
var s:String = "89567";
var s2:String = "89 cat";
var n:Number = 1.9897;

var i:int = int(s); // i is = 89567, cast works
var i2:int = int(s2); //Can't convert so i2 is set to 0
var i3:int = int(n); // i = 1
var n2:Number = Number(s2); // fails, n2 = NaN

//when used in equations you'll get very different results
var result:int = int(n) * 10; //result is 10
var result:int = n * 10; //result is 19.89700
var result:int = int(s2) * 10; //result is 0

trace(s2 as Number); //outputs null
trace(s2 as int); //outputs null
trace(Number(s2)); //outputs NaN

这是一个很好也很重要的主题,作为一般规则,我在处理对象时使用" as“,在使用更简单的数据类型时使用Cast(),但这正是我喜欢的代码结构。

票数 26
EN

Stack Overflow用户

发布于 2009-06-15 15:06:28

对数组使用'as‘。

代码语言:javascript
复制
var badArray:Array;
badArray = Array(obj);

将产生一个长度为1的数组,原始数组在第一个元素中。如果你像下面这样使用' as‘,你会得到预期的结果。

代码语言:javascript
复制
var goodArray:Array;
goodArray = obj as Array;

通常,在ActionScript中,' as‘比'Class()’更可取,因为它的行为更像是其他语言中的强制转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/996478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档