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 ()