AS3: лить или «как»?

Есть ли разница в использовании, эффективности или фоновой технике между

var mc:MovieClip = MovieClip(getChildByName("mc")); 

а также

 var mc:MovieClip = getChildByName("mc") as MovieClip; 

?

Выбор – это только вопрос согласия, предпочтения или случаи, когда вы не можете его использовать?

    В этой статье хорошо описаны различия:

    Ключевое различие между литьем и оператором as – это поведение при сбое. Когда сбой в действии ActionScript 2 возвращается null. Когда сбой в действии ActionScript 3, возникает TypeError. С оператором as в ActionScript 3, всякий раз, когда выполняется сброс, возвращается значение по умолчанию для типа данных.

    as также позволяет вам передавать в Array , что было невозможно раньше, поскольку функция преобразования Array() имела приоритет.

    EDIT: относительно производительности, используя, as сообщается, быстрее, чем отличная от стиля функция в различных статьях: [ 1 ] [ 2 ] [ 3 ]. В первой цитированной статье рассматриваются разницы в производительности по глубине и отчеты, что as 4 раза-4,5 раза быстрее.

    EDIT 2: не только as 4 раза быстрее, чем в обычном лучшем случае, но когда вы завершаете преобразование стиля (cast) в блоке try-catch, а ошибка на самом деле заканчивается, она больше похожа на 30x – 230x Быстрее. В AS3, если вы думаете, что собираетесь сделать что-то исключительное (в этом он может пропустить ошибку), тогда ясно, что вы всегда должны смотреть, прежде чем прыгать. Никогда не используйте try / catch, если только это не связано с API, и это значит, что это никогда не будет (cast) Также полезно взглянуть на последствия производительности try / catch, даже если исключение не выбрано. Существует штраф за выполнение настройки блока try / catch даже в счастливом случае, когда ничего не происходит.

    Поскольку никто еще не ответил на аспект производительности прямо, и это было в вашем вопросе, так as это значительно эффективнее и быстрее во время выполнения, чем (cast) в AS3.

    http://jacksondunstan.com/articles/830

    В сочетании со всеми другими факторами я не вижу абсолютно никаких оснований когда-либо использовать (cast) и чувствую, что этого следует избегать полностью.

    Отложенный комментарий ниже на самом деле напоминает мне о хорошем моменте, а также в отношении этого. Если вы (cast) то вы почти наверняка окажетесь в ситуации, когда вам придется попробовать / поймать

     try{ SubType(foo).bar(); }catch(e:TypeError){ // Can't cast to SubType } 

    Это убийственно медленно. Единственный способ – это проверить сначала

     if(foo is SubType){ SubType(foo).bar(); } 

    Который только кажется неправильным и расточительным.

    AS3. Кастинг одного типа в другой содержит ответ, который также отвечает на это: ключевое слово «as» присваивает значение null когда преобразование завершается с ошибкой, иначе оно выдает TypeError .

    Лучше всего использовать ключевое слово as .

    as имеет преимущество не бросать RTE (ошибка времени выполнения). Например, скажем, у вас есть class Dog который нельзя отнести в MovieClip; этот код выдает RTE:

     var dog:Dog = new Dog(); var mc:MovieClip = MovieClip(Dog); 

    TypeError: Error # 1034: Тип Coercion failed: невозможно преобразовать 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 

    Предпочитайте использование броска для использования as operator . Используйте оператор as только в том случае, если принуждение может завершиться ошибкой, и вы хотите, чтобы выражение оценивалось как null, а не выбрасывало исключение.

    Сделай это:

     IUIComponent(child).document 

    Не это:

     (child as IUIComponent).document 

    Соглашения о кодировании

    (cast) и «as» – это две совершенно разные вещи. В то время как «как» просто говорит компилятору интерпретировать объект так, как если бы он имел данный тип (который работает только в одном или в подclassах или в числовых / строковых преобразованиях), (cast) пытается использовать функцию статического преобразования целевого classа , Который может сбой (сброс ошибки) или возврат нового экземпляра целевого classа (уже не тот же объект). Это объясняет не только разницу скоростей, но и поведение в событии Error, как описано Alejandro PS

    Последствия очевидны: «как» следует использовать, если class объекта известен кодеру, но не компилятору (потому что он запутан с помощью интерфейса, который только называет суперclass или «*»). Проверка «есть» перед или нулевая проверка после (быстрее) рекомендуется, если предполагаемый тип (или тип, совместимый с автоматическим принуждением) не может быть на 100% гарантирован.

    (cast) следует использовать, если должно быть фактическое преобразование объекта в другой class (если возможно вообще).

    var mc:MovieClip = MovieClip(getChildByName("mc"));

    ПРЯМО СЕЙЧАС

    var mc:MovieClip = getChildByName("mc") as MovieClip;

    сделает mc действовать как мувиклип, если требуемый тип одинаковый

    Помимо запуска или отсутствия 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 () 
    Давайте будем гением компьютера.