Внимание! Эта статья не является «серьезной аналитикой». Только мои мысли и наблюдения.
Любите наблюдать за развитием дотнета? Вот, и я люблю. В данный момент не существует опубликованного списка изменений для будущих .NET 11 и C# 15, не говоря уж о более поздних версиях. Даже Devblogs пока хранит молчание. Благо, что C# - быстро развивающийся язык, и кое-что мы можем понять даже сейчас, если посмотрим, над чем активно ведется работа, а так же по запрашиваемым сообществом фичам.
Runtime async
Наверное, вы уже слышали о runtime async, даже есть отличная статья на Хабре. Если коротко, это позволит создавать легковесные асинхронные задачи, как горутины в Go, управление которыми ляжет на рантайм, без нагрузки на потоки ОС. Без преувеличения, самая ожидаемая фича, которая позволит C# выбить главный козырь из рукава Go.
UPD. @Lewigh верно подметил, что в статье говорится о несколько ином подходе:
Для реализации Async2 были рассмотрены два подхода: размотка стека (tasklets, stack unwindind) и JIT-сгенерированные машины состояний (continuations, JIT State Machine). Подход на основе JIT оказался предпочтительным благодаря лучшей совместимости с текущей инфраструктурой .NET, меньшим накладным расходам и более высокой производительности в большинстве сценариев. Размотка стека, хотя и поддерживает сложные конструкции, такие как byref и span, оказалась менее практичной из-за увеличения времени пауз сборки мусора и сложности реализации.
Самое главное, что всем знакомый синтаксис async\await не поменяется, так что это настоящий must have.
Можете сами ознакомиться с Issue по теме.
Union types
Типы объединений в функциональном стиле стали бы интересной возможностью в C#. Информация о них появилась еще в августе этого года, когда Мадс Торгерсен, ведущий разработчик языка C#, поделился планами об этом в видео.
Мотивация понятна: вы можете описывать типы, которые более дословно соответствуют API (как в TypeScript), например типичное:
{
...
someValue : string | int
}Теперь можно будет описать новой конструкцией:
public union Union<T1, T2>(T1, T2);
...
Union<string, int> SomeValue;Обратите внимание, что синтаксис объединений еще может поменяться.
Runtime reflection?
Звучит громко, понимаю. В данный момент рефлексия - самое слабое место C#. При активном развитии AOT и source generators, именно рефлексия вставляет палки в колеса. К счастью, развитие языка показывает, что и это временные трудности. Из недавнего можно вспомнить LibraryImport, UnsafeAccessor, partial events\constructors\properties. А что будет дальше?
Вероятно, нас ждут возможности по типу Enum.Source.Generator, но из коробки. К сожалению, единого мнения пока нет.
Tail return
В C# любая рекурсия (т.е. вызов функцией самой себя) требует O(n) памяти только для стека вызовов, то есть ваш алгоритм не может занимать меньше O(n) памяти. Как быть? Интересное предложение о добавлении нового ключевого слова для описания хвостовой рекурсии появилось аж в 2019 году.
void M(int x)
{
...
tail return M(x - 1);
}Хвостовая рекурсия - это особый вид рекурсии, при котором последний шаг в функции - это вызов самой себя.
В этом случае результат вызова возвращается сразу, без дополнительных действий.
Преимущества хвостовой рекурсии:
Меньше памяти - такие программы используют меньше места в памяти.
Нет переполнения - это особенно важно, если в программе много рекурсивных вызовов.
Функциональные (и не только) языки активно используют эту фичу, уменьшая накладные расходы на вызов. Надеюсь, C# рано или поздно реализует данную возможность из коробки.
К сожалению, последнее обновление в обсуждении числится началом января этого года.
