关于c#:Foreach,扩展方法和IEnumerable

Foreach, extension methods, and IEnumerable

只是出于好奇的快速提问。因此,根据有关foreach循环的msdn文档,它实现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),第二个线程正在使用此列表上的平均扩展方法。那么这会导致抛出异常吗?我知道使用锁可以避免任何潜在的问题,但是为了讨论起见,假设我没有使用锁。

谢谢你的时间。


So according to the MSDN documentation regarding foreach loop, it implements System.Collections.IEnumerable

不,任何支持GetEnumerator()方法的方法,反过来返回支持bool MoveNext()方法的对象和Current属性,都将支持foreachIEnumerableIEnumerable都支持这一点,因此实现它们的所有东西都将允许foreach,但这不是唯一的方法。虽然这不仅是一种方便的方法,而且也是一种可以与采用IEnumerable的方法(包括LINQ扩展方法)一起使用的方法,因此在您希望支持foreach时,通常最好采用这种方法。(你也可以选择支持另一种方式,如List所做的,但这几乎不值得)。

Also, out of curiosity, is a foreach loop more optimized than a for loop in terms of speed?

这很复杂,因为这是关于foreach在什么方面与for在什么方面的问题。for具有优势是很常见的,因为它涉及较少的虚拟调用,但是当foreach更快时,有例外。为了增加复杂性,如果您直接在一个数组上操作,那么foreach将变慢,除非编译器实际捕获并将其重写为一个for,以便它们完全相同。

What does the documentation mean when it says it performs a transform function on each element.

这意味着EDOCX1的特定重载(16)将每个元素传递给传递给它的EDOCX1的调用(17)。这个变换的结果是平均的。

Does this mean the extension method behaves similarly to a foreach loop?

对。事实上,他们通常是江户十一〔三〕人。该特定方法是.NET框架版本中的foreach,在.NET核心版本中对foreach进行了轻微的优化。在这两个版本中,许多方法都是foreach。有些方法在某些情况下使用for,在这些情况下,它的性能更高(请参见上文,了解有时情况如何,有时情况如何)。在绝大多数情况下,所做的许多优化都不值得,但许多人都大量使用LINQ方法,因此即使是一点点优化也会有回报。

The first thread is traversing through this list (foreach) and the second thread is using the Average extension method on this list. So will this cause an exception to be thrown?

在这种特殊情况下,只要没有线程写入列表,这两个线程就不会导致彼此出现任何问题。用于实现foreach的对象分别在每个线程中创建,它们是唯一会发生变化的对象。List的文档并不能保证这一点,但不太可能改变。

但是,这并不适用于支持foreach的所有内容。对于多线程foreach没有任何承诺,除非给定的实现能够实现它。