переменная a: число = 5 против значения a = 5 (ActionScript)

#flash #actionscript-3

#flash #actionscript-3

Вопрос:

Прошлой ночью я думал об этом вопросе во 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();
  

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

Ответ №1:

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

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:

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

Это также становится важным при работе с классами. Например, вы создаете закрытую переменную 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 есть метод воспроизведения (как бы это?). Таким образом, вводя его (в смысле добавления к нему типа, такого как MovieClip), вы даете компилятору знать, какие методы и свойства должны быть доступны.

Пример:

 var mymc:MovieClip = stage_mc; // Ahh, much better!
  

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

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

Комментарии:

1. Используя ваш метод, я повторяю одно и то же дважды, не так ли? (переменная mymc: MovieClip = stage_mc). Аналогичное нововведение есть и в C #. Есть неявное объявление «var» ( msdn.microsoft.com/en-us/library/bb383973.aspx ). Теперь я могу написать var a = new MyType(); вместо MyType a = new MyType(); И многие люди рекомендуют нам использовать стратегию «var» вместо «обычной» стратегии. » var mymc = stage_mc;» — flash не выдает исключение, однако он не отображает intellisense, но это проблема IDE. Таким образом, я вижу один положительный момент в вашем выборе: intellisense. Я прав?

Ответ №3:

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

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

Ответ №4:

На языке с сильной статической типизацией, таком как 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"
    }
  

Ответ №5:

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

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

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