【问题标题】:var a:Number = 5 vs var a=5 (ActionScript)var a:Number = 5 vs var a=5 (ActionScript)
【发布时间】:2011-05-02 11:14:04
【问题描述】:

昨晚我在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();

为什么他们使用第一种方法而不是第二种方法?

【问题讨论】:

    标签: flash actionscript-3


    【解决方案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
    

    结果显示了平均机器上的每一轮。无论上面示例中的数字究竟是什么,关键是要查看比率:

    ab 的情况下,我们没有为变量指定类型。在第三种情况 (c.) 中,我们给它一个类型,我们达到了 6.14 倍的速度提升。

    de 的情况下,您可以看到如果您真的专门设置类型会发生什么:整数和无符号整数。这种情况,所以如果你使用整数,你可以获得的速度是非常大的(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
      

      如果你想在 mymc 上调用一个 MovieClip 方法,比如 play(),编译器会抛出一个错误,因为它不“知道”mymc 有一个 play 方法(它会怎么做?)。因此,通过键入它(在向其添加类型的意义上,例如 MovieClip),您可以让编译器知道哪些方法和属性应该可用。

      例子:

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

      它还允许编译器进行类型检查。所以在上面的例子中,如果你试图将一个文本字段传递给movieclip变量mymc,一个错误就会抛出一个错误。这可以阻止更大的错误潜入。

      我非常热衷于 AS3 中的类型检查 - 我很高兴 Flash 终于推出了它,现在它就在这里,让我们使用它吧!

      【讨论】:

      • 用你的方法,我重复同样的事情两次,不是吗? (var 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 不会抛出异常,但它不会显示智能感知,但这是 IDE 的问题。因此,我可以在您的选择中看到一个积极的时刻:智能感知。我说的对吗?
      【解决方案3】:

      在 AS3 中,几乎没有充分的理由不显式键入内容。在某些情况下它是合适的,但类型系统可以防止出现问题。

      至于速度/内存差异,这是一个很好的解释:http://onflex.org/ACDS/AS3TuningInsideAVM2JIT.pdf

      【讨论】:

        【解决方案4】:

        在像 AS3 这样具有强静态类型的语言中,您应该始终在 decleration 时键入您的对象,这将使您的代码更清晰,并帮助您更轻松地跟踪错误。

        也就是说,AS3 通常非常宽容,并且能够在运行时确定您需要哪种类型。例如,这个 sn-p 工作正常:

            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】:

          在第二条语句中,编译器必须决定他必须使用哪种类型。 即 5 是一个整数,他也可以假设你的意思是

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

          同样为了代码完成的目的,最好定义一个类型 ;-) 但这不是一个真正的理由,因为一些 IDE 也可以处理这些。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-27
            • 1970-01-01
            • 2013-05-27
            相关资源
            最近更新 更多