var a: Number = 5 против var a = 5 (ActionScript) - PullRequest
1 голос
/ 02 мая 2011

Прошлой ночью я думал об этом вопросе во Flash

var a:Number = 5;
var a = 5;

Какая декларация лучше? Первое объявление работает быстрее и занимает меньше памяти? Все примеры AS содержат первый метод объявления (например, http://actionscriptexamples.com/2010/05/03/getting-started-with-the-tlftextfield-class-in-actionscript-3-0-and-flash-cs5/).

var tlfTxt:TLFTextField = new TLFTextField();

Почему они используют первый метод вместо второго?

Ответы [ 5 ]

7 голосов
/ 02 мая 2011

Также подумайте об оптимизации. Даже если вы можете объявить вашу переменную без типа, например

var a:* = 5, что можно использовать великолепно, все же рассмотрим следующий тест оптимизации:

var a = 5;
var b:* = 5;
var c:Number = 5;
var d:int = 5;
var e:uint = 5;

var time_start:Number = getTimer();

for(var i:int = 0; i < 10000000; i++)
{
    a += 1;
    //b += 1;
    //c += 1;
    //d += 1;
    //e += 1;
}

var time_stop:Number = getTimer();

trace(time_stop - time_start, "ms");

//a.) 650 ms
//b.) 651 ms
//c.) 106 ms
//d.) 69 ms
//e.) 69 ms

Результаты показывают каждый раунд на средней машине. Какими бы ни были числа в приведенном выше примере, нужно посмотреть на показатель:

В случаях a и b мы не указали тип переменной. В третьем случае ( c. ) мы дали ему тип, и мы достигли 6,14 увеличения скорости.

В случаях d и e вы можете увидеть, что произойдет, если вы действительно установите тип специально: целые и целые числа без знака. В этом случае, если вы используете целые числа, скорость, которую вы можете набрать, действительно велика ( 10x ).

Подумайте об этом при написании случайных функций, больших вычислений или сложных движков.

2 голосов
/ 02 мая 2011

В AS3 практически нет веских причин не вводить что-либо явно.Есть случаи, когда это уместно, но система типов предназначена для предотвращения проблем.

Что касается различий скорости / памяти, это довольно хорошее объяснение: http://onflex.org/ACDS/AS3TuningInsideAVM2JIT.pdf

2 голосов
/ 02 мая 2011

Всегда определяйте тип. Как уже упоминалось, если вы этого не сделаете, компилятор выберет для вас, и это может быть не так, как ожидалось.

Это также становится важным при работе с классами. Например, вы создаете приватную переменную foo в своем классе, например:

private var _foo; // no type is defined

Позже вы захотите добавить для него свойство get / set:

public function get foo():??? { return _foo; }
public function set foo(val:???):void { _foo = val; }

Что бы вы проходили? И как вы документируете это для кого-то еще, чтобы использовать?

Где, как если бы вы имели

private var _foo:Number;

public function get foo():Number { return _foo; }
public function set foo(val:Number):void { _foo = val; }

Понятно, что foo делает в обоих случаях get / set.

И еще одна вещь. Если вы хотите создать переменную MovieClip, которая ссылается на что-то на сцене, скажите:

var mymc = stage_mc; // Hmmm, not so good

Если вы хотите вызвать метод MovieClip для mymc, скажем, play (), компилятор выдаст ошибку, потому что он не «знает», что у mymc есть метод play (как это будет?). Таким образом, печатая его (в смысле добавления к нему типа, такого как MovieClip), вы даете компилятору знать, какие методы и свойства должны быть доступны.

* * Пример тысяча двадцать-один: * * 1 022
var mymc:MovieClip = stage_mc; // Ahh, much better!

Это также позволяет компилятору выполнять проверку типов. Таким образом, в приведенном выше примере, если вы попытались передать текстовое поле в переменную movieclip mymc, ошибка приведет к ошибке. Это останавливает появление больших ошибок.

Я очень увлечен проверкой типов в AS3 - я рад, что Flash наконец-то представил ее, и теперь, когда она здесь, давайте использовать ее!

0 голосов
/ 02 мая 2011

На языке со строгой статической типизацией, такой как AS3, вы всегда должны печатать свои объекты при объявлении, это сделает ваш код чище и поможет вам легче находить ошибки.

Тем не менее, AS3 обычно довольно простителени может выяснить, какой тип вам нужен во время выполнения.Например, этот фрагмент отлично работает:

    private var foo;

    public final function run():void {

        bar();
        baz();
    }

    private function bar():void {

        foo = 4;
        foo -= 0.5;
        trace( foo ); // traces "3.5"
    }

    private function baz():void {

        foo = "qux";
        trace( foo ); // traces "qux"
    }
0 голосов
/ 02 мая 2011

во 2-м утверждении компилятор должен решить, какой тип он должен использовать. то есть 5 - это целое число, которое он также может предположить, что вы имеете в виду

var a:int = 5;  or  var a:uint = 5;

также для целей автозавершения кода лучше определить тип ;-), но это не реальная причина, потому что некоторые IDE тоже могут с этим справиться.

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