В одной книге встретил вот такое высказывание:
Итераторы всех коллекций .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);
}
Цикл действительно становится бесконечным. Однако, почему?
Есть ли еще какие-нибудь не очевидные вещи в итераторах?
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
остаётся прежним.
Вообще эти проблемы хорошо описаны в этой статье.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
я делаю файловый менеджер на c#У меня возникла проблема(картинка прилагается)
Строится график значение по х от 0 до 1000Как конвертировать эти значение в DateTime? Нужно чтоб подписи на шкале были не (0, 100, 200
Необходимо удалить пробелы из объекта, через Trim() и Replace() - не получаетсяПишет, что ссылка на объект не указывает на экземпляр объекта
Как можно получить список ПК в домене(ip, имена ПК), находясь вне домена и имея доменную учётку?