actionscript 3 - tutorial - AS3: ¿lanzar o "como"?
que es la programacion actionscript en flash (8)
¿Hay alguna diferencia de uso, eficiencia o técnica de fondo entre
var mc:MovieClip = MovieClip(getChildByName("mc"));
y
var mc:MovieClip = getChildByName("mc") as MovieClip;
?
La elección es solo cuestión de convención, preferencia o hay casos en los que no puede usar uno?
Lo mejor es usar la palabra clave as
.
as
tiene la ventaja de no arrojar un RTE (error en tiempo de ejecución). Por ejemplo, supongamos que tienes un Dog
clase que no se puede convertir en un MovieClip; este código arrojará un RTE:
var dog:Dog = new Dog();
var mc:MovieClip = MovieClip(Dog);
TypeError: Error # 1034: Type Coercion failed: no se puede convertir Dog en MovieClip.
Para que pueda hacer que este código sea "seguro", debería abarcar el elenco en un bloque try
/ catch
.
Por otro lado, sería más seguro porque simplemente devuelve nulo si la conversión falla y luego puede verificar los errores usted mismo sin utilizar un bloque de try
/ catch
:
var dog:Dog = new Dog();
var mc:MovieClip = Dog as MovieClip;
if (mc)
//conversion succeeded
else
//conversion failed
Dado que nadie respondió el aspecto de rendimiento directamente todavía, y fue en su pregunta, as
es dramáticamente más eficiente y más rápido en tiempo de ejecución que (cast)
en AS3.
http://jacksondunstan.com/articles/830
Combinado con todos los otros factores, no veo absolutamente ninguna razón para usar (cast)
y siento que debe evitarse por completo.
El comentario retractado a continuación en realidad me recuerda un buen punto también con respecto a esto. Si tú (cast)
, seguramente te encontrarás en una situación en la que tendrás que intentar / atrapar
try{
SubType(foo).bar();
}catch(e:TypeError){
// Can''t cast to SubType
}
Lo cual es asesinamente lento. La única forma de evitarlo es un cheque primero
if(foo is SubType){
SubType(foo).bar();
}
Lo cual parece equivocado y derrochador.
Prefiere el uso de un yeso para el uso del as operator
. Utilice el operador as solo si la coerción puede fallar y desea que la expresión evalúe como nula en lugar de lanzar una excepción.
Hacer esto:
IUIComponent(child).document
No esta:
(child as IUIComponent).document
Este artículo describe bien las diferencias:
Una diferencia clave entre el casting y el operador as es el comportamiento en caso de falla. Cuando una conversión falla en ActionScript 2, se devuelve null. Cuando una conversión falla en ActionScript 3, se lanza TypeError. Con el operador as en ActionScript 3, siempre que falla una conversión, se devuelve el valor predeterminado para el tipo de datos.
as
también le permite lanzar a Array
, lo que no era posible antes, ya que la función de conversión Array()
tenía prioridad.
EDITAR: relativo a la ejecución, utilizando as
se informa que es más rápido que el fundido de estilo de llamada de función en varios artículos: [ 1 ] [ 2 ] [ 3 ]. El primer artículo citado analiza las diferencias de rendimiento en profundidad e informa que es 4x-4.5x más rápido.
EDIT 2: no solo es 4x-4.5x más rápido en el mejor de los casos normales, sino que cuando ajusta la conversión de estilo (cast)
en un bloque try-catch, y un error realmente termina siendo lanzado, es más como 30x - 230x Más rápido. En AS3, si crees que vas a hacer algo excepcional (en el sentido de que podría arrojar un error), entonces está claro que siempre debes mirar antes de saltar. Nunca use try / catch a menos que la API lo obligue, y eso significa que nunca (cast)
También es instructivo observar las implicaciones de rendimiento de try / catch incluso cuando no se lanza ninguna excepción. Hay una penalización en el rendimiento al configurar un bloque try / catch incluso en el caso feliz de que nada sale mal.
var mc:MovieClip = MovieClip(getChildByName("mc"));
lo establecerá DIRECTAMENTE COMO movieclip
var mc:MovieClip = getChildByName("mc") as MovieClip;
hará que mc actúe como un clip de película, si el tipo requerido es el mismo
Además de lanzar o no RTE, o devolver nulo, hay una diferencia significativa cuando gestionamos errores en un swf cargado en un dominio de aplicación separado.
Usando Loader.uncaughtErrorEvents para manejar los errores del swf cargado; si lanzamos como ''event.error como Error'', el error resultante tendrá el rastro original de la pila (el mismo que había sido capturado en el swf que causó el error) mientras que si lo fundió con Error (event.error), la pila El trazo del error se cambiará por la traza actual de la pila (en la que se realizó el molde).
Código de muestra:
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));
}
Muestra de salida:
Casting with ''as Error''
ReferenceError: Error # 1056
at Player / onEnterFrame ()
casting with ''Error (...)''
Error: ReferenceError: Error # 1056
at package :: HandlerClass / uncaughtErrorHandler ()
at EventInfo / listenerProxy ()
(cast) y "as" son dos cosas completamente diferentes. Mientras que ''como'' simplemente le dice al compilador que interprete un objeto como si fuera del tipo dado (que solo funciona en las mismas o subclases o conversiones numéricas / de cadena), el (reparto) intenta usar una función de conversión estática de la clase objetivo . Que puede fallar (lanzar un error) o devolver una nueva instancia de la clase objetivo (ya no es el mismo objeto). Esto explica no solo las diferencias de velocidad sino también el comportamiento en el evento Error, como lo describe Alejandro PS
Las implicaciones son claras: ''as'' debe usarse si la clase de un objeto es conocida por el codificador pero no por el compilador (porque está ofuscada por una interfaz que solo nombra una superclase o ''*''). Una verificación "es" antes o una verificación nula posterior (más rápida) es recomendable si el tipo asumido (o un tipo compatible con la auto coerción) no se puede garantizar al 100%.
(cast) se debe usar si tiene que haber una conversión real de un objeto en otra clase (si es posible).
AS3 Lanzar un tipo a otro contiene la respuesta que también responde esto: la palabra clave "como" asigna null
cuando la conversión falla, de lo contrario arroja un TypeError
.