2010-07-17 235 views
2

是否有從POV性能差/的MemoryUsage之前初始化一個對象,或返回狀態之後,如「樣品」在:對象初始化

Function Foo() as ComplexObject 

    ' is there a difference ??? ' 
    ' A ' 
    ' Dim obj as New ComplexObject() ' 

    If condition Then Return Nothing 

    ' is there a difference ??? '   
    ' B ' 
    Dim obj as New ComplexObject() 
    ... 
    Return obj 

End Function 

回答

2

如果你的意思,但比較:

Dim obj as New ComplexObject() 

If condition Then Return Nothing之前,則是:是有區別的:它之前完成,那麼它new每次一個對象,即使它很快被丟棄並從gen-0收集(對於返回Nothing的情況)。然而,如果你只是If之前聲明它(沒有New),那麼兩者應該是相同的(由於IL中的所有本地數據庫都是方法範圍的,所以局部變量的位置是無關緊要的)。

我不知道VB的,但在C#中,您還可以使用條件運算符:

return condition ? null : new ComplexObject(); 
+0

我擔心編譯器會創建(並初始化)所有聲明的對象(在內部循環之外)。 – serhio 2010-07-17 22:33:57

+0

關於VB.NET中C#或IIF運算符的'?'不能用於我的情況,因爲或者我返回一個Nothing(null)或者我需要用新的ComplexObject做一些事情,而不是直接返回它。 – serhio 2010-07-17 22:44:55

+1

@serhio - *聲明*發生在IL的開始處;然而,創建**必須在您的代碼所說的邏輯點上發生。 – 2010-07-17 22:46:31

1

唯一的區別是,創建對象在返回之前什麼都不會使用更多的CPU - 無論哪種方式,對象都將被正確地垃圾回收,並且不再被引用。

我大家都贊成儘可能晚地定義/聲明變量。

+0

所以,你確認「A」變種更多的CPU和內存消耗。 – serhio 2010-07-17 22:29:17

+0

我一定會期待它 - 編譯器可能會「做正確的事情」並將對象創建移動到if(...)return,以便優化發佈版本,但我不會在這就是這樣。 – 2010-07-17 22:40:13

1

是的,因爲您正在分配本地對象,所以一旦它離開了需要進行垃圾回收的方法,就會產生差異。

+0

因此,無論聲明的位置如何,編譯器都不會在函數的開頭創建所有聲明的對象? – serhio 2010-07-17 22:31:20

+0

在Release模式下,編譯器可能會檢測到您正在創建一個永遠不會使用的對象,因此可能會將其刪除,但我不會依賴它。只需在需要時儘可能晚地聲明/初始化變量。 – 2010-07-17 22:38:14

+0

事實上,我認爲在編譯時'條件'不能被驗證,只有在運行時這是可能的。 – serhio 2010-07-17 22:41:05