Подтвердить что ты не робот

Будет ли этот цикл foreach вызывать Split() каждую итерацию в С#?

Если у меня есть цикл for, как показано ниже:

foreach(string email in installerEmails.Split(','))
{
    Console.WriteLine(email);
}

Будет ли вызов Split() выполняться на каждой итерации цикла? Нужно ли хранить его в массиве temp перед его повторением?

4b9b3361

Ответ 1

Нет. Он будет перебирать результат этого вызова, т.е. Тип возврата Split, который является строковым массивом: string[].

Ответ 2

Нет. Просто отлаживайте свой код. вы увидите, что метод Split() вызывается только один раз.

Ответ 3

Результат 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);
}

Одна уродливая деталь - это явное приведение к типу, который вы указываете в цикле for, который генерирует компилятор. Это было полезно в С# 1.0, где IEnumerator не был общим.

Я забыл, что Enumerator убирается. См. Ответ Jon Hanna для кода, который включает в себя удаление.

Ответ 4

Нет. Объект, возвращаемый Split (который, оказывается, является массивом, но то же самое относится к другим перечисляемым объектам) - это то, что определяет цикл в конце концов. Если у него есть нуль или миллион элементов, именно он определяет нулевые или миллионы итераций, которые он не мог бы сделать, если бы он продолжал вызываться.

Для более подробной информации полученный код становится эквивалентным:

string[] temp = installerEmails.Split(',');
var enumerator = temp.GetEnumerator();
try
{
  while(enumerator.MoveNext())
  {
    string email = (string)enumerator.Current;
    Console.WriteLine(email);
  }
}
finally
{
  if(enumerator is IDisposable)
    ((IDisposable)enumerator).Dispose()
}

Как вы можете видеть, .Split() вызывается только один раз.

Ответ 5

Split будет вызываться один раз, что приводит к массиву. Затем foreach использует один перечислитель для итерации по массиву.

Ответ 6

Нет..Split() возвращает IEnumerable и будет использоваться для повторения.