Actionscript 3 AS3:铸造或“铸造”;“作为”吗;?
两者在使用、效率或背景技术上有什么不同吗Actionscript 3 AS3:铸造或“铸造”;“作为”吗;?,actionscript-3,flash,casting,coding-style,conventions,Actionscript 3,Flash,Casting,Coding Style,Conventions,两者在使用、效率或背景技术上有什么不同吗 var mc:MovieClip = MovieClip(getChildByName("mc")); 及 ? 选择只是惯例、偏好的问题,还是有些情况下不能使用?很好地描述了不同之处: 强制转换和as操作符之间的一个关键区别是行为 一旦失败。当ActionScript 2中的强制转换失败时,返回null。 当ActionScript 3中的强制转换失败时,将抛出TypeError。和 作为ActionScript 3中的运算符,每当强制转换失败时,都会
var mc:MovieClip = MovieClip(getChildByName("mc"));
及
?
选择只是惯例、偏好的问题,还是有些情况下不能使用?很好地描述了不同之处:
强制转换和as操作符之间的一个关键区别是行为
一旦失败。当ActionScript 2中的强制转换失败时,返回null。
当ActionScript 3中的强制转换失败时,将抛出TypeError。和
作为ActionScript 3中的运算符,每当强制转换失败时,都会返回默认值
对于,返回数据类型
as
还允许您强制转换到数组
,这是以前不可能的,因为转换函数数组()
优先
编辑:关于性能,据报道,使用as
比各种文章中的函数调用样式转换更快:[]。引用的第一篇文章深入研究了性能差异,并报告说as
速度快了4-4.5倍
编辑2:在正常的最佳情况下,不仅
比快4倍-4.5倍,而且当您将(cast)
样式转换包装在一个try-catch块中,并且实际抛出错误时,更像是快30倍-230倍。在AS3中,如果您认为您将要做一些异常的事情(因为它可能会抛出错误),那么很明显,您应该三思而后行。除非API强制使用,否则不要使用try/catch,事实上,这意味着永远不要使用(cast)
。即使没有引发异常,查看try/catch的性能影响也是很有意义的。即使在没有出错的情况下,设置try/catch块也会带来性能损失。也包含回答这个问题的答案:“as”关键字在转换失败时分配null
,否则会抛出TypeError最好使用as
关键字
as
的优点是不抛出RTE(运行时错误)。例如,假设您有一个类狗,它不能在电影剪辑中播放;此代码将抛出一个RTE:
var dog:Dog = new Dog();
var mc:MovieClip = MovieClip(Dog);
TypeError:错误#1034:类型强制失败:无法将Dog转换为MovieClip
为了使此代码“安全”,您必须在try
/catch
块中包含该演员阵容
另一方面,as
会更安全,因为如果转换失败,它只会返回null,然后您可以自己检查错误,而无需使用try
/catch
块:
var dog:Dog = new Dog();
var mc:MovieClip = Dog as MovieClip;
if (mc)
//conversion succeeded
else
//conversion failed
与使用作为运算符相比,更喜欢使用强制转换。仅当强制可能失败并且希望表达式的计算结果为null而不是引发异常时,才使用as运算符
这样做:
IUIComponent(child).document
不是这个:
(child as IUIComponent).document
因为还没有人直接回答性能方面的问题,而这正是您的问题,as
在运行时比AS3中的(cast)
效率更高、速度更快
结合所有其他因素,我认为绝对没有理由使用(cast)
,我觉得应该完全避免使用它
下面收回的评论实际上也让我想起了一个很好的观点。如果你(cast)
,那么你几乎肯定会发现自己处于一种必须尝试/抓住的境地
try{
SubType(foo).bar();
}catch(e:TypeError){
// Can't cast to SubType
}
速度慢得要命。唯一的解决方法是先检查
if(foo is SubType){
SubType(foo).bar();
}
这似乎是错误的和浪费的。更进一步地说,启动或不启动RTE,或返回null,当我们管理加载到单独应用程序域中的swf中的错误时,会有很大的不同
使用Loader.uncaughtErrorEvents处理加载的swf的错误;如果我们像“event.error as error”那样强制转换,则生成的错误将具有原始堆栈跟踪(与导致错误的swf中捕获的堆栈跟踪相同),而如果使用error(event.error)强制转换,则错误的堆栈跟踪将由当前堆栈跟踪(在其中进行强制转换)更改
示例代码:
if (event && event.error && event.error is Error) {
debug ("Casting with 'as Error'")
debugStackTrace (event.error as Error);
debug ("casting with 'Error (...)'");
debugStackTrace (Error (event.error));
}
样本输出:
Casting with 'as Error'
ReferenceError: Error # 1056
at Player / onEnterFrame ()
casting with 'Error (...)'
Error: ReferenceError: Error # 1056
at package :: HandlerClass / uncaughtErrorHandler ()
at EventInfo / listenerProxy ()
var mc:MovieClip=MovieClip(getChildByName(“mc”)代码>
将直接将其设置为movieclip
var mc:MovieClip=getChildByName(“mc”)作为MovieClip代码>
将使mc表现得像电影剪辑,如果所需类型相同(演员阵容)和“as”是两个完全不同的东西。虽然“as”只是告诉编译器将对象解释为给定类型(仅适用于相同或子类或数字/字符串转换),但(cast)尝试使用目标类的静态转换函数。它可能会失败(抛出错误)或返回目标类的新实例(不再是同一个对象)。这不仅解释了速度差异,还解释了错误事件的行为,如Alejandro P.S.所述
其影响是明确的:
如果编码器知道对象的类,但编译器不知道对象的类,则使用“as”(因为由仅命名超类或“*”的接口混淆)。如果假定类型(或与自动强制兼容的类型)无法100%确定,则建议在之前进行“是”检查,或在之后进行空检查(更快)
(强制转换)在必须将一个对象实际转换为另一个类(如果可能的话)时使用。注意,如果性能非常关键,则将用作比常规强制转换慢。因此,如果您知道强制转换不会失败,您可能只想强制转换变量,而不是将用作。嗯,根据另一个答案中链接到的一些测试,我似乎错了。也许这是一个“老太太的故事”,但有人告诉我使用,因为的速度较慢,我只是相信它。有什么想法吗?SunilD。这是一个关于妻子的故事。除了Jackson Dunstan的博客和他的测试套件上的链接文章之外,我自己的ind
Casting with 'as Error'
ReferenceError: Error # 1056
at Player / onEnterFrame ()
casting with 'Error (...)'
Error: ReferenceError: Error # 1056
at package :: HandlerClass / uncaughtErrorHandler ()
at EventInfo / listenerProxy ()