2011-07-28 227 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

是的,它会更好,如果你使用类。移动大量数据毫无意义。