2008-11-26 22 views
1

我發現,在我每天的Flex/Flash作品,我做的這個數字有很多:Actionscript - 是否更好地投射或創建一個新的變量?或者它有什麼關係?

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

的問題是 - 這是做到這一點的最好方法是什麼?我應該這樣做:

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

這可能是偶然的,但我只是想知道是否有一個「接受」的方式或首選的方式來做到這一點。第二個選項似乎更具可讀性,但我想知道是否需要更多性能影響來創建新變量。還是這一切都歸結爲風格和偏好?

回答

2

它通常沒關係。創建一個var只是創建一個指向該對象的指針,所以它不會使用更多的內存或類似的東西。

第二個例子肯定更具可讀性和可調試性,因此應該是首選。

從創建臨時變量運行的風險是,您可能會延遲或阻止該對象的垃圾回收。當它只是一個函數中的局部變量時,這通常不是問題;當您創建變量並將它們傳遞時,請記住範圍。

對於深入的內容,請閱讀格蘭特斯金納的資源管理系列AVM2: http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

5

重要的是要記住,有明確的鑄造和使用as關鍵字之間的差異是很重要的。 Casting在失敗時會拋出錯誤,而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 

就個人而言,我心中判定方法,使用時承擔這些行爲。一般來說,我建議明確地施放,因爲您會確切地知道演員陣容失敗的方式/時間。然而,通常情況下,你可能想要默默地失敗並繼續。

0

對於第二個示例,您可能需要測試無效性,以在調用「mySpecialFunction」時避免NullPointerException。

var tempItem:MyCustomObject = container.getChildAt(i) as MyCustomObject; 

if (tempItem) 
{ 
    tempItem.mySpecialFunction(); 
} 

我通常更喜歡第二種方法,但您必須記住,您只能使用as操作符來鑄造「Date」和「Array」類型。

+0

只能使用as運算符來鑄造Date和Array類型?這對我來說是新聞。我很確定這是不對的。 我喜歡你的空檢查。 – aaaidan 2008-12-01 02:10:41

相關問題