【发布时间】:2018-09-06 03:46:15
【问题描述】:
出于好奇,我只是一个简短的问题。因此,根据 MSDN 关于 foreach 循环的文档,它实现了 System.Collections.IEnumerable。文档中还有一个警告,您不能在使用 foreach 循环时修改集合(我假设 foreach 循环在这方面不是非常线程安全的?)
文档:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/foreach-in
另外,出于好奇,在速度方面,foreach 循环是否比 for 循环更优化?我知道 foreach 循环更容易输入/阅读,但它的执行速度是否比 for 循环快?
查看 MSDN 文档中的列表,扩展方法 Average 是由 Enumerable 定义的。当文档说它对每个元素执行转换功能时,文档是什么意思? 这是否意味着扩展方法的行为类似于 foreach 循环? 文档:https://msdn.microsoft.com/en-us/library/bb549067(v=vs.110).aspx
假设地说,假设我有两个线程。假设我有一个由这两个线程共享的列表。第一个线程正在遍历这个列表(foreach),第二个线程正在使用这个列表上的 Average 扩展方法。那么这会导致抛出异常吗?我知道使用锁可以避免任何潜在的问题,但为了讨论,假设我没有使用锁。
感谢您的宝贵时间。
【问题讨论】:
-
循环遍历列表和
Average()都只从列表中读取,所以这不会导致异常。foreach的速度取决于GetEnumerator()的实现方式。 -
您是否尝试过运行一些基准测试?您在处理集合时无法更改集合,这与线程安全无关,但是,例如,如果您执行 for 并删除最后一项,则会出现堆栈溢出。
-
也许它只是拼写错误,但您似乎对 foreach 循环的作用有误解。循环本身不实现
IEnumerable,它只允许迭代实现IEnumerable的对象。关于在循环时修改集合的部分不是线程安全问题,因为循环正在迭代集合,如果集合正在改变,你怎么能合理地迭代它? -
如果您仔细阅读how to ask 和on-topic 中的内容,您会发现SO 并不是真正适合“假设”和“假设”的地方。向我们展示您的代码有问题 - 或自己测试。
-
只是一个更正,我不记得确切的例外,但您可以自己查看。 ;)
标签: c# foreach extension-methods enumerable