- PVSM.RU - https://www.pvsm.ru -
Внимание! Эта статья не является «серьезной аналитикой». Только мои мысли и наблюдения.
Любите наблюдать за развитием дотнета? Вот, и я люблю. В данный момент не существует опубликованного списка изменений для будущих .NET 11 и C# 15, не говоря уж о более поздних версиях. Даже Devblogs [1] пока хранит молчание. Благо, что C# - быстро развивающийся язык, и кое-что мы можем понять даже сейчас, если посмотрим, над чем активно ведется работа, а так же по запрашиваемым сообществом фичам.
Наверное, вы уже слышали о runtime async, даже есть отличная статья [2] на Хабре. Если коротко, это позволит создавать легковесные асинхронные задачи, как горутины в Go, управление которыми ляжет на рантайм, без нагрузки на потоки ОС. Без преувеличения, самая ожидаемая фича, которая позволит C# выбить главный козырь из рукава Go.
UPD. @Lewigh [3] верно подметил, что в статье говорится о несколько ином подходе:
Для реализации Async2 были рассмотрены два подхода: размотка стека (tasklets, stack unwindind) и JIT-сгенерированные машины состояний (continuations, JIT State Machine). Подход на основе JIT оказался предпочтительным благодаря лучшей совместимости с текущей инфраструктурой .NET, меньшим накладным расходам и более высокой производительности в большинстве сценариев. Размотка стека, хотя и поддерживает сложные конструкции, такие как byref и span, оказалась менее практичной из-за увеличения времени пауз сборки мусора и сложности реализации.
Самое главное, что всем знакомый синтаксис asyncawait не поменяется, так что это настоящий must have.
Можете сами ознакомиться с Issue по теме [4].
Типы объединений в функциональном стиле стали бы интересной возможностью в C#. Информация о них появилась еще в августе этого года, когда Мадс Торгерсен, ведущий разработчик языка C#, поделился планами об этом в видео.
Мотивация понятна: вы можете описывать типы, которые более дословно соответствуют API (как в TypeScript), например типичное:
{
...
someValue : string | int
}
Теперь можно будет описать новой конструкцией:
public union Union<T1, T2>(T1, T2);
...
Union<string, int> SomeValue;
Обратите внимание, что синтаксис объединений еще может поменяться.
Обсуждение по теме [5].
Звучит громко, понимаю. В данный момент рефлексия - самое слабое место C#. При активном развитии AOT и source generators, именно рефлексия вставляет палки в колеса. К счастью, развитие языка показывает, что и это временные трудности. Из недавнего можно вспомнить LibraryImport, UnsafeAccessor, partial eventsconstructorsproperties. А что будет дальше?
Вероятно, нас ждут возможности по типу Enum.Source.Generator [6], но из коробки. К сожалению, единого мнения пока нет.
В C# любая рекурсия (т.е. вызов функцией самой себя) требует O(n) памяти только для стека вызовов, то есть ваш алгоритм не может занимать меньше O(n) памяти. Как быть? Интересное предложение о добавлении нового ключевого слова для описания хвостовой рекурсии появилось [7] аж в 2019 году.
void M(int x)
{
...
tail return M(x - 1);
}
Хвостовая рекурсия - это особый вид рекурсии, при котором последний шаг в функции - это вызов самой себя.
В этом случае результат вызова возвращается сразу, без дополнительных действий.
Преимущества хвостовой рекурсии:
Меньше памяти - такие программы используют меньше места в памяти.
Нет переполнения - это особенно важно, если в программе много рекурсивных вызовов.
Функциональные (и не только) языки активно используют эту фичу, уменьшая накладные расходы на вызов. Надеюсь, C# рано или поздно реализует данную возможность из коробки.
К сожалению, последнее обновление в обсуждении числится началом января этого года.
Автор: Ydav359
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/yazy-k-programmirovaniya/440480
Ссылки в тексте:
[1] Devblogs: https://devblogs.microsoft.com/dotnet/
[2] статья: https://habr.com/ru/articles/928322/
[3] @Lewigh: https://www.pvsm.ru/users/lewigh
[4] Issue по теме: https://github.com/dotnet/runtime/issues?q=is%3Aissue%20state%3Aopen%20milestone%3A11.0.0%20label%3Aruntime-async
[5] Обсуждение по теме: https://github.com/dotnet/csharplang/discussions/7010
[6] Enum.Source.Generator: https://github.com/EngRajabi/Enum.Source.Generator
[7] появилось: https://github.com/dotnet/csharplang/issues/2304
[8] Источник: https://habr.com/ru/articles/981476/?utm_source=habrahabr&utm_medium=rss&utm_campaign=981476
Нажмите здесь для печати.