Подтвердить что ты не робот

ActionScript: Есть ли веская причина использовать "как" кастинг?

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

var bar0:Bar = someObj as Bar;  // "as" casting
var bar1:Bar = Bar(someObj); // "class name" casting (for want of a better name)

Также, пожалуйста, исправьте меня, если я ошибаюсь здесь, as casting либо вернет экземпляр класса, либо null, в то время как casting класса будет либо возвращать экземпляр класса, либо поднять исключение, если литье невозможно - кроме этого, они идентичны.

Учитывая это, тем не менее, as кастинг кажется серьезным нарушением принципа fail-fast-fail-early... И мне трудно представить себе ситуацию, когда было бы предпочтительнее использовать as cast, а не просто имя класса (с, возможно, с instanceof).

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

4b9b3361

Ответ 1

Вам нужно использовать 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).

`

Ответ 2

В этом обсуждении стоит отметить несколько моментов.

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

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

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

if(o)
{
    //do stuff
}

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

"as" также более согласуется с остальной частью языка (т.е.: myObject - 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

Это хорошая и важная тема, как правило, я использую "как" при работе с Object и Cast() при использовании более простых типов данных, но именно так, как мне нравится структурировать код.

Ответ 3

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

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

Ответ 4

Используйте 'as' с массивами.

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

Выдает массив длиной один с исходным массивом в первом элементе. Если вы используете "как", как указано ниже, вы получите результат с расширенным результатом.

var goodArray:Array;
goodArray = obj as Array;

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

Ответ 5

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

например.

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