这个foreach循环会在C#中每次迭代调用Split()吗?

Fra*_*oss 18 c#

如果我有一个像下面这样的for循环:

foreach(string email in installerEmails.Split(','))
{
    Console.WriteLine(email);
}
Run Code Online (Sandbox Code Playgroud)

是否会在循环的每次迭代中调用Split()?在迭代之前,我是否需要将它存储在临时数组中?

Ahm*_*eed 26

不会.它将迭代该调用的结果,即返回类型为Split字符串数组:string[].


Cod*_*aos 5

Split的结果被评估一次,然后在其上调用GetEnumerator().这将返回一个IEnumerator,在每次迭代中调用MoveNext方法和Current属性.

它基本上相当于:

string[] enumerable=installerEmails.Split(',');
IEnumerator<string> enumerator=enumerable.GetEnumerator();
while(enumerator.MoveNext())
{
    string email=(string)enumerator.Current;
    Console.WriteLine(email);
}
Run Code Online (Sandbox Code Playgroud)

一个丑陋的细节是对编译器生成的for循环中给出的类型的显式强制转换.这在C#1.0中很有用,其中IEnumerator不是通用的.

我忘记了调查员被处置了.请参阅Jon Hanna对包含处理的代码的回答.