Информация об изменениях

Сообщение Re[17]: Догонит ли net java? от 09.12.2022 21:46

Изменено 10.12.2022 8:30 Serginio1

Re[17]: Догонит ли net java?
Здравствуйте, ·, Вы писали:
S>>·>Немного многословно, приходится типы полей прописывать, но вполне юзабельно.
S>> Кстати в Java завезли аналог IEnumerable c yield
·>yield как конструкцию языка нет, не завезли. Другие средства есть на уровне библиотек, вроде хватает.

S>>То есть вызов осуществляется с права на лево как в C#?

·>Классика map-reduce — вначале строится цепочка преобразований (flatmaps & Co) потом коллектор (reduce). Коллектор тащит всё через цепочку. Вроде слева направо. Не знаю что ты имеешь в виду "как в C#".
Ну в C# ты получаешь IEnumerable. Причем не первый а последний. При MoveNext последний дергает MoveNext предыдущего.
И получается, что у самого первого будет проходов равного его размера.
То есть IEnumerable.Range(1,3).Select(i=> new {twice = i * 2, str = "val" + i}).Where(v => v.twice > 3 && v.str.contains("3"));

можно разложить на несколко операторов
list=IEnumerable.Range(1,3);
Обозначим анонимный тип new {twice = i * 2, str = "val" + i} как TResult
select=Enumerable.Select<int,TResult>(list, i=> new {twice = i * 2, str = "val" + i})
и поледний
result=IEnumerable.Where<TResult>(select, v => v.twice > 3 && v.str.contains("3"));

В Итоге ты получаешь IEnumerable<TResult>

И когда ты начинаешь обход или то вызываешь MoveNext у result

result вызовет MoveNext у select, а select у list.
То есть вызов идет с права на лево
Можно посмотреть на исходники https://github.com/microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs
Ленивость сделана через yield.
Вернее yield создает анонимный класс реализующий IEnumerable Что такое yield и как он работает в C#?

Внутри этого класса State Machine. Кстати по этому же принципу работает и async/await/
То есть компилятор берет на себя генерацию анонимных классов реализующих State Machine и методов IEnumerable MoveNext и Current в итоге
Re[17]: Догонит ли net java?
Здравствуйте, ·, Вы писали:
S>>·>Немного многословно, приходится типы полей прописывать, но вполне юзабельно.
S>> Кстати в Java завезли аналог IEnumerable c yield
·>yield как конструкцию языка нет, не завезли. Другие средства есть на уровне библиотек, вроде хватает.

S>>То есть вызов осуществляется с права на лево как в C#?

·>Классика map-reduce — вначале строится цепочка преобразований (flatmaps & Co) потом коллектор (reduce). Коллектор тащит всё через цепочку. Вроде слева направо. Не знаю что ты имеешь в виду "как в C#".
Ну в C# ты получаешь IEnumerable. Причем не первый а последний. При MoveNext последний дергает MoveNext предыдущего.
И получается, что у самого первого будет проходов равного его размера.
То есть IEnumerable.Range(1,3).Select(i=> new {twice = i * 2, str = "val" + i}).Where(v => v.twice > 3 && v.str.contains("3"));

можно разложить на несколко операторов
list=IEnumerable.Range(1,3);
Обозначим анонимный тип new {twice = i * 2, str = "val" + i} как TResult
select=Enumerable.Select<int,TResult>(list, i=> new {twice = i * 2, str = "val" + i})
и поледний
result=IEnumerable.Where<TResult>(select, v => v.twice > 3 && v.str.contains("3"));

В Итоге ты получаешь IEnumerable<TResult>

И когда ты начинаешь обход или то вызываешь MoveNext у result

result вызовет MoveNext у select, а select у list.
То есть вызов идет с права на лево
Можно посмотреть на исходники https://github.com/microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs
Ленивость сделана через yield.
Вернее yield создает анонимный класс реализующий IEnumerable Что такое yield и как он работает в C#?

Внутри этого класса State Machine. Кстати по этому же принципу работает и async/await/
То есть компилятор берет на себя генерацию анонимных классов (или уже существующих как WhereEnumerableIterator<TSource>) реализующих State Machine и методов IEnumerable MoveNext и Current в итоге.