2011-07-28 137 views
-2

我有一些在foreach循環中創建對象的代碼。所以:在foreach循環中創建對象

private IEnumerable<StrongTypeResult> ConvertResults(List<Object> results) 
    { 
    return results.Select(result => new StrongTypeResult(result)).ToList();  
    } 

FYI,StrongTypeResult是一個結構。由於每個new StrongTypeResult(result)對象都分配在堆棧上,因此如果有大量對象要創建,我是否會遇到一個stackoverflow問題? StrongTypeResult上課會更好嗎?

+9

我不相信你的代碼會做你認爲它的作用。 –

+6

你在代碼示例中是否缺少'yield'語句?編輯:其實我甚至不確定這裏發生了什麼。 –

+0

我同意@Chris你可能錯過了一個良率。至於你的其他問題,在這裏你沒有任何堆棧構造項目,即使你這樣做了,結構也包裝了一個'Object',它是對某個項目的引用,我們不知道它是什麼。基本上,我不會擔心這裏的一個stackoverflow。我會更擔心這個代碼沒有做它應該做的。 – pstrjds

回答

2

首先,你不需要在這裏的foreach。選擇已經返回所需類型的IEnumerable。你也不需要一個ToList。在客戶端上傳遞IEnumerable時將調用轉換委託。

private IEnumerable<StrongTypeResult> ConvertResults(List<Object> results) 
{ 
return results.Select(result => new StrongTypeResult(result)); 
} 

當您將結構賦值給變量時,會在堆棧上創建結構。如果你將它們存儲在一個列表或一個數組中,它們將堆在一起。

請了解引用類型與值類型(如結構)之間的差異。 通常,在分配給另一個變量時會複製結構。

1

如果你只想跑進StackOveFlowException它足以創造不定式遞歸調用

public void DeadLoop() 
{ 
    this.DeadLoop(); 
} 
+3

根據平臺和優化,這可能會由於尾遞歸優化而導致無限循環。 – dlev

+0

@dlev:好的,謝謝! – sll

0

是的,它會更好,如果你使用類。移動大量數據毫無意義。