Actionscript - лучше ли привести или создать новую переменную? Или это вообще имеет значение? - PullRequest
1 голос
/ 26 ноября 2008

Я обнаружил, что в своей ежедневной работе с Flex / Flash я часто делаю это число:

//Calling a function...
MyCustomObject(container.getChildAt(i)).mySpecialFunction();

Вопрос - это лучший способ сделать это? Должен ли я сделать это:

//Calling a function
var tempItem:MyCustomObject = container.getChildAt(i) as MyCustomObject;
tempItem.mySpecialFunction();

Это может быть случайным, но мне просто интересно, есть ли «принятый» способ или предпочтительный способ сделать это. Второй вариант кажется более читабельным, но мне интересно, требуется ли больше удара по производительности для создания новой переменной. Или все сводится к стилю и предпочтениям?

Ответы [ 3 ]

5 голосов
/ 01 декабря 2008

Важно помнить, что существует разница между явным приведением и использованием ключевого слова as. Кастинг выдает ошибку, когда он терпит неудачу, тогда как ключевое слово as этого не делает (просто возвращает ноль).

// a casting error
try {
    var number:int = 666;
    var urlreq:URLRequest = URLRequest( number );
} catch(e:TypeError) {
    // TypeError: Error #1034: Type Coercion failed: cannot 
    //            convert 666 to flash.net.URLRequest.
    trace(e); 
}

Принимая во внимание, что ключевое слово as не срабатывает молча:

var number:int = 666;
var urlreq:URLRequest = number as URLRequest;
trace(urlreq); // prints null to the debug pane

Лично я учитываю это поведение при принятии решения о методе использования. Как правило, я бы рекомендовал явное приведение, поскольку вы будете точно знать, как / когда произойдет сбой приведения. Тем не менее, часто вы можете молча потерпеть неудачу и продолжить.

2 голосов
/ 26 ноября 2008

Это вообще не имеет значения. Создание переменной просто создает указатель на объект, поэтому он не использует больше памяти или что-то в этом роде.

Второй пример определенно более удобен для чтения и отладки и поэтому должен быть предпочтительным.

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

Для более глубокого изучения предмета прочитайте серию Гранта Скиннера об управлении ресурсами в AVM2: http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

0 голосов
/ 01 декабря 2008

для второго примера вы можете захотеть проверить недействительность, чтобы избежать исключения NullPointerException при вызове «mySpecialFunction», например,

var tempItem:MyCustomObject = container.getChildAt(i) as MyCustomObject;

if ( tempItem )
{
   tempItem.mySpecialFunction();
}

Я обычно предпочитаю второй подход, но вы должны помнить, что вы можете использовать только оператор as для приведения типов «Дата» и «Массив».

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