2011-07-28 18 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'をラッピングしています。基本的に、ここではスタックオーバーフローが心配されません。私は、このコードが必要なことをしていないと心配しています。 – pstrjds

答えて

2

まず、foreachは必要ありません。 Selectは既に、必要な型の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

を作成するのに十分です。多くのデータを動かすことには意味がありません。

関連する問題