Неочевидное поведение итераторов

346
03 мая 2017, 07:32

В одной книге встретил вот такое высказывание:

Итераторы всех коллекций .NET Framework являются изменяемыми структурами. Это, с одной стороны, избавляет от дополнительного выделения памяти в управ- ляемой куче при проходе по коллекции, а с другой стороны, может привести к не- ожиданному результату. Попробуйте предугадать поведение следующего кода (листинг 4.8), а потом запустите его, чтобы проверить свою догадку. Листинг 4.8. Неочевидное поведение итераторов

var x = new {Items = new List<int> {1, 2, 3}.GetEnumerator()};
while (x.Items.MoveNext())
{
Console.WriteLine(x.Items);
}

Цикл действительно становится бесконечным. Однако, почему?

Есть ли еще какие-нибудь не очевидные вещи в итераторах?

Answer 1

x.Items это публичное поле объекта, при этом оно является структурой, а при обращении к таким полям создаётся временная переменная. То есть на самом деле этот код выглядит приблизительно так (сам код синтаксически не верен):

var x = new { Items = new List<int> { 1, 2, 3 }.GetEnumerator() };
while (var tmp = x.Items, tmp.MoveNext())
{
    Console.WriteLine(x.Items);
}

То есть при каждой итерации while создаётся копия значения x.Items, которая и изменяется методом MoveNext(), но вот само x.Items остаётся прежним.

Вообще эти проблемы хорошо описаны в этой статье.

READ ALSO
Процесс не может получить доступ к файлу С#

Процесс не может получить доступ к файлу С#

я делаю файловый менеджер на c#У меня возникла проблема(картинка прилагается)

426
OxyPlot LinearAxis конвертировать значение в DateTime

OxyPlot LinearAxis конвертировать значение в DateTime

Строится график значение по х от 0 до 1000Как конвертировать эти значение в DateTime? Нужно чтоб подписи на шкале были не (0, 100, 200

376
Как удалить пробелы из объекта?

Как удалить пробелы из объекта?

Необходимо удалить пробелы из объекта, через Trim() и Replace() - не получаетсяПишет, что ссылка на объект не указывает на экземпляр объекта

333
Как можно получить список ПК в домене?

Как можно получить список ПК в домене?

Как можно получить список ПК в домене(ip, имена ПК), находясь вне домена и имея доменную учётку?

227