我发现在我的日常Flex / Flash工作中,我做了很多这个数字:
//Calling a function...
MyCustomObject(container.getChildAt(i)).mySpecialFunction();
问题是 - 这是最好的方法吗?我应该这样做:
//Calling a function
var tempItem:MyCustomObject = container.getChildAt(i) as MyCustomObject;
tempItem.mySpecialFunction();
这可能是偶然的,但我只是想知道是否有“接受”的方式或首选方式来做到这一点。第二个选项似乎更具可读性,但我想知道创建一个新变量是否需要更多的性能影响。或者这一切都取决于风格和偏好?
答案 0 :(得分:5)
重要的是要记住显式转换和使用as
关键字之间存在差异。转换失败时会抛出错误,而as
关键字则不会(它只返回null)。
// 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);
}
as
关键字无声地失败:
var number:int = 666;
var urlreq:URLRequest = number as URLRequest;
trace(urlreq); // prints null to the debug pane
就个人而言,在决定使用方法时,我会记住这些行为。一般来说,我建议明确地进行投射,因为您将确切知道投射失败的方式/时间。但是,通常情况下,您可能希望无声地失败并继续。
答案 1 :(得分:2)
一般无所谓。创建一个var只会创建一个指向该对象的指针,因此它不会使用更多内存或类似内容。
第二个例子肯定更具可读性和可调试性,因此应该是首选。
您从创建临时变量运行的风险是您可能会延迟或阻止该对象的垃圾回收。当它只是函数中的局部变量时,这通常不是问题;在创建变量并传递变量时,请记住这一点。
有关该主题的深入内容,请阅读Grant Skinner关于AVM2中资源管理的系列文章: http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html
答案 2 :(得分:0)
对于第二个示例,您可能需要测试nullity以避免在调用“mySpecialFunction”时出现NullPointerException,例如
var tempItem:MyCustomObject = container.getChildAt(i) as MyCustomObject;
if ( tempItem )
{
tempItem.mySpecialFunction();
}
我通常更喜欢第二种方法,但您必须记住,您只能使用as运算符来转换“Date”和“Array”类型。