Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Вопрос по IEnumerable  [new]
_rumbler_
Member

Откуда:
Сообщений: 183
Что происходит за кадром?

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


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


3. тоже работает ожидаемо. а можно как-то "сломать", чтобы было как в п.1?
var x3 = new List<int> { 1, 2, 3 }.GetEnumerator();
while (x3.MoveNext())
{
    Console.WriteLine(x3.Current);
}
18 сен 17, 21:11    [20804622]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по IEnumerable  [new]
_rumbler_
Member

Откуда:
Сообщений: 183
п.3 "сломал". видно из-анонимного типа в п.1 как-то "не точно" вывод типа произошел?

var x3 = new List<int> { 1, 2, 3 }.GetEnumerator();
while (((IEnumerator)x3).MoveNext())
{
      Console.WriteLine(x3.Current);
}
18 сен 17, 21:40    [20804666]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по IEnumerable  [new]
Pallaris
Member

Откуда: Украина, Донецк
Сообщений: 1565
_rumbler_,

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

п.3 ты сломал, потому что в цикле структуру приведением к типу (IEnumerator) каждый раз упаковываешь, в результате создается копия исходной структуры в памяти
19 сен 17, 10:43    [20805204]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по IEnumerable  [new]
_rumbler_
Member

Откуда:
Сообщений: 183
Pallaris
_rumbler_,

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

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


чем принципиально отличается п.1 и п.3, что так происходит?
19 сен 17, 10:54    [20805238]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по IEnumerable  [new]
Pallaris
Member

Откуда: Украина, Донецк
Сообщений: 1565
_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>
19 сен 17, 12:14    [20805592]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по IEnumerable  [new]
_rumbler_
Member

Откуда:
Сообщений: 183
Pallaris,

спасибо!
19 сен 17, 12:16    [20805605]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить