代码之家  ›  专栏  ›  技术社区  ›  Paul Mignard

Actionscript-强制转换或创建新变量更好吗?或者这有什么关系?

  •  1
  • Paul Mignard  · 技术社区  · 16 年前

    我发现在我的日常Flex/Flash工作中,我经常做这个数字:

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

    问题是——这是最好的方法吗?我应该这样做:

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

    这可能是偶然的,但我只是想知道是否有一个“接受”的方式或首选的方式来做到这一点。第二个选项看起来更具可读性,但我想知道创建新变量是否需要更多的性能影响。或者这一切都归结于风格和偏好?

    3 回复  |  直到 16 年前
        1
  •  5
  •   aaaidan    16 年前

    记住显式转换和使用 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); 
    }
    

    鉴于 关键字以静默方式失败:

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

    就我个人而言,在决定使用何种方法时,我会牢记这些行为。一般来说,我建议明确地强制转换,因为您将确切地知道强制转换失败的方式/时间。但是,通常情况下,您可能希望默默地失败并继续。

        2
  •  2
  •   RickDT    16 年前

    创建临时变量的风险在于可能会延迟或阻止该对象的垃圾收集。当它只是函数中的一个局部变量时,这通常不是问题;在创建变量并传递它们时,请记住范围。

    要深入了解该主题,请阅读Grant Skinner在AVM2中的资源管理系列: http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

        3
  •  0
  •   user41994 user41994    16 年前

    var tempItem:MyCustomObject = container.getChildAt(i) as MyCustomObject;
    
    if ( tempItem )
    {
       tempItem.mySpecialFunction();
    }
    

    我通常更喜欢第二种方法,但您必须记住,您只能使用as运算符来强制转换“Date”和“Array”类型。