Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по IEnumerable / 6 сообщений из 6, страница 1 из 1
18.09.2017, 21:11
    #39522955
_rumbler_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по IEnumerable
Что происходит за кадром?

1. в бесконечном цикле выводит 0. пишут, что из-за того, что у List GetEnumerator() возвращает структуру, и внутренний current не инкрементируется
Код: c#
1.
2.
3.
4.
5.
var x1 = new { Items = new List<int> { 1, 2, 3 }.GetEnumerator() };
while (x1.Items.MoveNext())
{
    Console.WriteLine(x1.Items.Current);
}



2. а так работает ожидаемо. т.е. тут GetEnumerator() уже возвращает не структуру? или что произошло?
Код: c#
1.
2.
3.
4.
5.
var x2 = new { Items = ((IEnumerable<int>)new List<int> { 1, 2, 3 }).GetEnumerator() };
while (x2.Items.MoveNext())
{
    Console.WriteLine(x2.Items.Current);
}



3. тоже работает ожидаемо. а можно как-то "сломать", чтобы было как в п.1?
Код: c#
1.
2.
3.
4.
5.
var x3 = new List<int> { 1, 2, 3 }.GetEnumerator();
while (x3.MoveNext())
{
    Console.WriteLine(x3.Current);
}
...
Рейтинг: 0 / 0
18.09.2017, 21:40
    #39522961
_rumbler_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по IEnumerable
п.3 "сломал". видно из-анонимного типа в п.1 как-то "не точно" вывод типа произошел?

Код: c#
1.
2.
3.
4.
5.
var x3 = new List<int> { 1, 2, 3 }.GetEnumerator();
while (((IEnumerator)x3).MoveNext())
{
      Console.WriteLine(x3.Current);
}
...
Рейтинг: 0 / 0
19.09.2017, 10:43
    #39523116
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по IEnumerable
_rumbler_,

в п.1 в цикле x1.Items каждый раз возвращает новую копию структуры
в п.2 в x2.Items лежит объект типа IEnumerator<T>, который находится в куче и является ссылочным (читай про упаковку/boxing)
в п.3 ты обращаешься в цикле к одной и той же структуре, лежащей в стеке

п.3 ты сломал, потому что в цикле структуру приведением к типу (IEnumerator) каждый раз упаковываешь, в результате создается копия исходной структуры в памяти
...
Рейтинг: 0 / 0
19.09.2017, 10:54
    #39523128
_rumbler_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по IEnumerable
Pallaris_rumbler_,

в п.1 в цикле x1.Items каждый раз возвращает новую копию структуры
в п.2 в x2.Items лежит объект типа IEnumerator<T>, который находится в куче и является ссылочным (читай про упаковку/boxing)
в п.3 ты обращаешься в цикле к одной и той же структуре, лежащей в стеке

п.3 ты сломал, потому что в цикле структуру приведением к типу (IEnumerator) каждый раз упаковываешь, в результате создается копия исходной структуры в памяти

чем принципиально отличается п.1 и п.3, что так происходит?
...
Рейтинг: 0 / 0
19.09.2017, 12:14
    #39523215
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по IEnumerable
_rumbler_Pallaris_rumbler_,

в п.1 в цикле x1.Items каждый раз возвращает новую копию структуры
в п.2 в x2.Items лежит объект типа IEnumerator<T>, который находится в куче и является ссылочным (читай про упаковку/boxing)
в п.3 ты обращаешься в цикле к одной и той же структуре, лежащей в стеке

п.3 ты сломал, потому что в цикле структуру приведением к типу (IEnumerator) каждый раз упаковываешь, в результате создается копия исходной структуры в памяти

чем принципиально отличается п.1 и п.3, что так происходит?

Why anonymous types Equals implementation compares fields?
:
Anonymous type instances are immutable data values without behavior or identity.


Т.к. он immutable, то обращение в п.1 обращение к полю Items приводит к созданию в памяти новой структуры типа List<int>.Enumerator.

В п.3 происходит обращение к одному и тому же объекту List<int>.Enumerator.

В п.2 же у этого объекта вообще тип IEnumerator<int>
...
Рейтинг: 0 / 0
19.09.2017, 12:16
    #39523216
_rumbler_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по IEnumerable
Pallaris,

спасибо!
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по IEnumerable / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]