Внимание! Эта статья не является «серьезной аналитикой». Только мои мысли и наблюдения.

Любите наблюдать за развитием дотнета? Вот, и я люблю. В данный момент не существует опубликованного списка изменений для будущих .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);
}

Хвостовая рекурсия - это особый вид рекурсии, при котором последний шаг в функции - это вызов самой себя.

В этом случае результат вызова возвращается сразу, без дополнительных действий.

Преимущества хвостовой рекурсии:

  1. Меньше памяти - такие программы используют меньше места в памяти.

  2. Нет переполнения - это особенно важно, если в программе много рекурсивных вызовов.

Функциональные (и не только) языки активно используют эту фичу, уменьшая накладные расходы на вызов. Надеюсь, C# рано или поздно реализует данную возможность из коробки.

К сожалению, последнее обновление в обсуждении числится началом января этого года.