Actionscript 3导入包.*vs import package.Class

Pei*_*iau 15 import optimization packages actionscript-3

在Actionscript 3中,导入完整包与导入独立类之间是否有任何卷轴开销?

例如:import flash.display.*vs import flash.display.Sprite

我知道从包中仅导入所需的类以避免冲突是一个好习惯,但是我经常被告知如果我在许多不同的类中导入完整的包,它也会在编译的文件大小方面有成本这些包中的一些类.

我想知道是否会为整个项目一次性导入一个类,或者如果在使用它们的类之间增加导入.

产生的编译文件大小和运行时性能是这个问题所包含的两个不同方面.

Jac*_*rdt 7

唯一的打击应该是编译时间,但rday写道,有一个小小的打击.但这应该是Adobe将来会解决的问题.

import语句不应该被视为实际的导入,它只是编译器知道您引用哪些类的一种方式.

例如.如果您创建了自己的Point类并且它正在另一个包中使用,则编译器需要知道您是在引用自己的Point类还是Adobe Point类.

另一种方法是将您提到的完全限定名称evertime写入类中.

例如. var mySprite:flash.display.Sprite = new flash.display.Sprite();

正如Juan Pablo Califano在评论中指出的那样,这实际上并不适用于编译器(尽管我认为它可能适用于AS2).我只是想指出为什么我们开始使用import语句.

在任何情况下,如果你导入一个完整的包,它不应该影响编译的文件(尽管它显然是这样).它将如何影响编译时间,因为您为编译器提供了需要查看的更多内容.

至于"导入"同一个类不止一次.它不会有所作为.编译器只包含一次相同的类.否则编译后的文件大小会很快失控,因为大多数类都引用了许多类,这些类再次引用其他类等.但是,Adobe可能会优化其中.

底线是你应该只导入你需要的东西,导入整个包没有真正的优势.只需使用像FlashDevelop这样的正确编码工具(它是免费的),你甚至不必自己编写import语句.

另外,如果您正在编译库(其中还包含未提及的类),我不确定导入外部包是否可能包含在您编译的文件中.这可能会产生实际影响; 虽然希望Adobe没有在那里搞砸;)


小智 5

解决ryanday的观点,我无法解释额外的3个字节,但有几个注意事项......

由于行李超重,"ActionScript设计模式"一书也不鼓励这样做

是的,在第115页,但我认为这是错误的并提交了勘误表.

ActionScript 3规范说如果使用'*',将导入包中的所有公共名称.所以有一个打击,

它有点,但我不同意解释和命中.它说:"包裹成员的名字可见 ......"(完整).在此上下文中,它指的是使编译器和编辑器工具可见的成员名称,在编译的SWF中不可见.IE浏览器意味着类被编译到SWF -除非他们实际使用(声明类型的变量).

查看此内容的另一种方法是,您可以手动导入flash.display.MovieClip.但是,如果您不创建任何MovieClip实例,则MovieClip类将不会编译到最终的SWF中.

为了满足自己,我用3种方式编译了以下helloworld,输出@secoif建议的链接报告...

package
{
    import flash.display.Sprite;
    import flash.text.TextField;

    public class ASHelloWorld extends Sprite
    {
        public function ASHelloWorld()
        {
            var tf:TextField = new TextField();
            tf.text = "Hello World!";
            addChild( tf );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,正如所写,链接报告:

<report>
  <scripts>
    <script name="~/Documents/eclipse3.5carbonFbPlugin-FX4-LS10/ASHelloWorld/src/ASHelloWorld.as" mod="1278415735000" size="682" optimizedsize="344">
      <def id="ASHelloWorld" />
      <pre id="flash.display:Sprite" />
      <dep id="AS3" />
      <dep id="flash.text:TextField" />
    </script>
  </scripts>
  <external-defs>
    <ext id="AS3" />
    <ext id="flash.text:TextField" />
    <ext id="flash.display:Sprite" />
  </external-defs>
</report>
Run Code Online (Sandbox Code Playgroud)

其次,删除链接报告文件并将导入更改为:

    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.text.TextField;
Run Code Online (Sandbox Code Playgroud)

清理构建,链接报告看起来完全相同.相同的大小,相同的优化,相同的链接类.

第三,删除链接报告文件并将导入更改为:

    import flash.display.*;
    import flash.text.*;
Run Code Online (Sandbox Code Playgroud)

清理构建,链接报告看起来完全相同.相同的大小,相同的优化,相同的链接类.

在每种情况下,只有Sprite和TextField类才能使其成为SWF.

查看磁盘上的实际SWF文件大小,确实有3个版本的轻微(1或2个字节)变化.没有比ryanday帖子中提到的更大的SWF差.