ActionScript: Есть ли веская причина использовать «как» приведение? - PullRequest
18 голосов
/ 15 июня 2009

Из того, что я понимаю в ActionScript, есть два вида приведений:

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 приведение является серьезным нарушением принципа fail-fast-fail-early ... И у меня возникают проблемы с представлением ситуации, когда было бы предпочтительнее использовать as приведение, а не приведение имени класса (возможно, с добавлением instanceof).

Итак, мой вопрос: при каких обстоятельствах предпочтительнее использовать as кастинг?

Ответы [ 5 ]

26 голосов
/ 15 июня 2009

В этой дискуссии стоит отметить пару моментов.

Существует существенное различие в том, как эти две функции, Class () будет пытаться привести объект к указанному классу, но в случае неудачи (иногда зависит от типа данных) выдает ошибку времени выполнения. С другой стороны, использование объекта в качестве класса будет в первую очередь выполнять проверку типа, и если указанный объект не может быть приведен к указанному классу, вместо него возвращается нулевое значение.

Это очень важное различие и полезный инструмент в разработке. Это позволяет нам делать следующее:

var o:MyClass = myArray[i] as MyClass;

if(o)
{
    //do stuff
}

Я думаю, что полезность этого довольно очевидна.

«as» также более соответствует остальному языку (т. Е. «MyObject is MyClass»).

Метод MyClass () имеет дополнительные преимущества при работе с простыми типами данных (int, Number, uint, string). Некоторые примеры этого:

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» при работе с Objects и Cast () при использовании более простых типов данных, но мне нравится структурировать свой код.

12 голосов
/ 15 июня 2009

Вам нужно использовать as для приведения в двух сценариях: приведение к Date и приведение к Array.

Для дат, вызов Date(xxx) ведет себя так же, как новый Date().toString().

Для массивов вызов Array(xxx) создаст Array с одним элементом: xxx.

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

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

`

5 голосов
/ 02 июля 2009

Они на самом деле делают разные вещи ... когда вы говорите

myvar as ClassName

На самом деле вы просто сообщаете компилятору, что этот объект является либо ClassName, либо подклассом ClassName

когда вы говорите:

ClassName(myvar)

На самом деле он пытается преобразовать его в объект такого типа.

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

Примеры:

var myvar:String = '<data/>';
var othervar:XML = XML(myvar); //right

var myvar:String = '<data/>';
var othervar:XML = (myvar as XML); //wrong

var myvar:XML = <data/>;
var othervar:XML = myvar as XML; // right
1 голос
/ 15 июня 2009

Использовать «как» с массивами.

var badArray:Array;
badArray = Array(obj);

Получит массив длиной один с исходным массивом в первом элементе. Если вы используете «как» следующим образом, вы получите ожидаемый результат.

var goodArray:Array;
goodArray = obj as Array;

Как правило, «as» предпочтительнее «Class ()» в ActionScript, так как он ведет себя больше как приведение в других языках.

0 голосов
/ 15 июня 2009

Я использую его, когда у меня есть ArrayCollection объектов, и мне нужно перечислить их или использовать функцию выбора.

, например

var abc: mytype = mycollection.getItemAt (i) как mytype

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...