- PVSM.RU - https://www.pvsm.ru -

Как поменяется .NET и C# в ближайшие годы?

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

Любите наблюдать за развитием дотнета? Вот, и я люблю. В данный момент не существует опубликованного списка изменений для будущих .NET 11 и C# 15, не говоря уж о более поздних версиях. Даже Devblogs [1] пока хранит молчание. Благо, что C# - быстро развивающийся язык, и кое-что мы можем понять даже сейчас, если посмотрим, над чем активно ведется работа, а так же по запрашиваемым сообществом фичам.

Runtime async

Наверное, вы уже слышали о 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].

Union types

Типы объединений в функциональном стиле стали бы интересной возможностью в C#. Информация о них появилась еще в августе этого года, когда Мадс Торгерсен, ведущий разработчик языка C#, поделился планами об этом в видео.

Мотивация понятна: вы можете описывать типы, которые более дословно соответствуют API (как в TypeScript), например типичное:

{
  ...
  someValue : string | int
}

Теперь можно будет описать новой конструкцией:

public union Union<T1, T2>(T1, T2);
...
Union<string, int> SomeValue;

Обратите внимание, что синтаксис объединений еще может поменяться.

Обсуждение по теме [5].

Runtime reflection?

Звучит громко, понимаю. В данный момент рефлексия - самое слабое место C#. При активном развитии AOT и source generators, именно рефлексия вставляет палки в колеса. К счастью, развитие языка показывает, что и это временные трудности. Из недавнего можно вспомнить LibraryImport, UnsafeAccessor, partial eventsconstructorsproperties. А что будет дальше?

Вероятно, нас ждут возможности по типу Enum.Source.Generator [6], но из коробки. К сожалению, единого мнения пока нет.

Tail return

В C# любая рекурсия (т.е. вызов функцией самой себя) требует O(n) памяти только для стека вызовов, то есть ваш алгоритм не может занимать меньше O(n) памяти. Как быть? Интересное предложение о добавлении нового ключевого слова для описания хвостовой рекурсии появилось [7] аж в 2019 году.

void M(int x)
{
    ...
    tail return M(x - 1);
}

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

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

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

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

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

Функциональные (и не только) языки активно используют эту фичу, уменьшая накладные расходы на вызов. Надеюсь, 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