C# — один из самых популярных языков программирования, используемый для разработки приложений, веб-сервисов и игр. В этой статье мы заглянем в его историю: рассмотрим ключевые изменения от версии к версии и различные инструменты, без которых C# трудно представить.

1999 — Крутой язык
Всё началось во время разработки платформы .NET Framework. Библиотеки классов этого фреймворка изначально были написаны с использованием системы компилятора управляемого кода Simple Managed C. Но уже в 1999 году Андрес Хейлсберг собрал команду для создания нового языка под рабочим названием COOL (C-Like Object Oriented Language). Планировалось, что он сохранит его после релиза, но этого не получилось из-за проблем с торговой маркой.
В итоге в 2000 году на конференции Professional Developers Conference проект .NET был публично анонсирован, а язык получил название C#.
Оно имеет двойную трактовку. Во-первых, C# получил название благодаря наследованию от С++. Создатели добавили ещё два плюса и получили решётку. Во-вторых, C# в музыкальной нотации означает до-диез. Об этой трактовке названия, кстати, был забавный слайд в докладе Андрея Акиньшина из JetBrains на конференции Dotnext:

Андрес Хейлсберг был причастен к разработке Turbo Pascal и Embarcadero Delphi, поэтому C# был в том числе вдохновлён и этими языками. Помимо этого, разработчики C# черпали вдохновение в языках C++, Java и Smalltalk. Для C# задали следующий список целей проектирования:
C# должен быть простым, современным, универсальным и объектно-ориентированным языком программирования.
Язык должен обеспечивать строгую типизацию, проверку границ массивов, обнаруживать попытки использования неинициализированных переменных, поддерживать переносимость исходного кода и автоматическую сборку мусора.
Язык может применяться для разработки программных компонентов, способных работать в распределённых средах.
С# должен обеспечивать переносимость программ, что особенно важно для разработчиков, работающих с C и C++.
Другим важным аспектом является поддержка интернационализации.
Язык может использоваться для написания приложений как для основных, так и для встраиваемых систем.
2002 — C# 1.0: стартуем
Первая версия языка вышла в январе 2002 года вместе с релизом Visual Studio .NET 2002. Она довольно сильно напоминала язык Java, но дополняла его возможности.
Например, в C# были свойства (выглядели как поля объекта, но при обращении к ним вызывали методы класса), индексаторы (подобные свойствам, но принимали параметр как индекс массива), события, циклы foreach
, встроенные свойства взаимодействия с неуправляемым кодом (DLL, COM) и многое другое.
Также некоторые возможности C# были унаследованы от C++: беззнаковые типы, перегрузка операторов, методы с переменным числом параметров, оператор goto
. В C# сохранилась возможность работать с указателями, однако несколько ограниченная: это было возможно только в местах кода, обозначенных словом unsafe
, и при указании специальной опции компилятору.
Помимо указанных возможностей, первая версия C# содержала:
классы;
структуры;
интерфейсы;
делегаты;
операторы и выражения;
атрибуты.
В апреле 2003 года в составе Visual Studio .NET 2003 вышла версия C# 1.1, а за ней и C# 1.2. Они содержали небольшое количество мелких изменений языка. Например, начиная с 1.2, код, создаваемый внутри цикла foreach
, вызывал IDispose
в IEnumerator
, если этот IEnumerator
реализует IDisposable
.
Тот же год: .NET Framework
.NET Framework — программная платформа, которая была разработана и выпущена компанией Microsoft в 2002 году.
Во время одной из пресс-конференций Стивен Балмер заявил, что Microsoft, несмотря на возможности домашних ПК, считает важным обеспечить работу служб нового поколения на различных устройствах, а не только на стационарных компьютерах. Из-за ограниченной мощности аккумуляторов мобильных устройств приложения должны были храниться и передаваться через серверы, что отличалось от практики хранения данных локально на стационарных ПК.
У Microsoft было много причин для перехода к новой стратегии. Компания уже лидировала на рынке операционных систем и браузеров, имела опыт в разработке ПО для Интернета и предоставлении программного обеспечения по подписке. Также в компании существовало множество несовместимых технологий и сред разработки, поэтому одной из целей новой платформы было объединение лучших наработок и их унификация.
Согласно планам, предусматривалась разработка новой версии операционной системы и среды разработки для веб-приложений. Основой для новой стратегии послужила разработка Windows DNA 2000, которая объединяла обновлённую СУБД SQL Server и инструменты для создания веб-приложений.
Платформа включала в себя набор технологий для создания и выполнения программных приложений на различных языках программирования.
Её основным компонентом стала Common Language Runtime (CLR) — общеязыковая среда исполнения для байт-кода CIL (Common Intermediate Language), в которой компилировались программы, написанные на совместимых с .NET языках. CLR обеспечивала управление памятью, безопасность, обработку исключений и управление многозадачностью.
Одним из ключевых аспектов CLR стала поддержка различных совместимых с .NET языков программирования. Функциональность, предоставляемая CLR, была доступна для всех языков, которые использовали эту среду. Это позволило разработчикам писать код на одном языке и использовать его в контексте других языков, что создало большую гибкость при разработке приложений.
2005 — C# 2.0
7 ноября 2005 года вместе с Visual Studio 2005 вышел C# версии 2.0. В этой версии произошло множество различных нововведений.
Например, появились обобщённые типы (generics), которые в отличие от шаблонов в C++ получили дополнительные возможности и работали на уровне виртуальной машины.
Появились разделённые типы — возможность разделить определение класса по нескольким файлам. Такая возможность была полезна для рефакторинга, а source generators с помощью этой функции могли добавлять дополнительную функциональность в класс. Обозначались разделённые типы с помощью модификатора partial
.
Также появились:
возможность создавать с помощью
delegate
анонимные функции, обеспечивающие функциональность замыкания;nullable-типы;
итераторы и оператор
yield return
;оператор
??
.
Некоторые изменения расширили уже существовавшие возможности:
отдельный доступ к методу получения и методу задания (
get
,set
);преобразования групп методов (делегаты);
статические классы;
выведение делегата.
Тот же год: релиз Unity
Unity — это мощная кроссплатформенная среда для разработки компьютерных игр и приложений, разработанная компанией Unity Technologies и использующая C# как основной язык. Первая версия среды была анонсирована в 2005 на Worldwide Developers Conference и вышла в том же году. Уже в декабре 2009 года Game Developer назвал Unity одним из самых значимых участников на рынке игровых компаний.
Изначально Unity разрабатывалась исключительно для macOS, но позднее появилась возможность работать и на других платформах.
Сегодня Unity позволяет создавать приложения, которые могут работать на более чем 25 различных платформах, включая персональные компьютеры (Windows, macOS, Linux), игровые консоли (PlayStation, Xbox, Nintendo), мобильные устройства (iOS, Android), веб-приложения, а также платформы виртуальной и дополненной реальности. Более того, одна и та же игра или одно и то же приложение, написанные на Unity, могут быть запущены на каждой из этих платформ.
Используемая в Unity модульная система компонентов позволяет создавать гибкие и легко расширяемые игры, упрощая повторное использование кода и его поддержку. Каждый компонент решает конкретную задачу, что облегчает отладку и масштабирование, а также улучшает командную работу и производительность.
Одним из значительных факторов популярности Unity является её доступность для независимых разработчиков. Но с этим были проблемы. Например, в 2023 году произошёл скандал, связанный с изменением лицензии: разработчики любого приложения на Unity должны были платить за каждую установку программы при достижении определённого количества установок. Такие изменения в лицензировании вызвали довольно серьёзное возмущение в сообществе разработчиков. В итоге Unity отменили комиссию для игр с доходом менее $1 млн, повысили лимит со 100 до 200 тыс. долларов, а также отменили требование к использованию заставки "Made with Unity".
2006 — Windows Presentation Foundation
Windows Presentation Foundation (WPF) — это бесплатный и открытый фреймворк для разработки пользовательских интерфейсов для настольных приложений, работающих на Windows. Изначально WPF был разработан компанией Microsoft и впервые вышел в составе .NET Framework 3.0 в 2006 году.
WPF использовал XAML (язык разметки на основе XML) для описания и связывания различных элементов интерфейса и C# для определения поведения программы. В WPF разметка интерфейса была отделена от логики приложения, что делало код более читаемым и поддерживаемым. Также это повлияло на то, что верстальщики и программисты получили возможность работать раздельно (ранее в WinForms такой возможности не было). Приложения, разработанные на WPF, представляли собой самостоятельные desktop программы, которые можно запускать непосредственно на компьютере пользователя.
WPF использовал библиотеки времени выполнения, которые входят в состав всех версий операционных систем Microsoft Windows, начиная с Windows Vista и Windows Server 2008. Это означало, что для работы приложений, использующих WPF, не требовалось дополнительной установки компонентов, так как они уже были включены в операционную систему.
На Microsoft Connect в декабре 2018 года корпорация объявила о переходе WPF в Open Source и его размещении на GitHub. С этого момента WPF стал доступен для всех разработчиков под лицензией MIT, что значительно облегчило его использование и модификацию. Но несмотря на это, он всё ещё был предназначен для разработки под Windows и не являлся кроссплатформенным.
Дизайн WPF и язык разметки XAML в будущем были адаптированы и использованы в нескольких других фреймворках для создания пользовательских интерфейсов, например, в Avalonia и Uno.
2007 — C# 3.0
Новая версия C# вышла в ноябре 2007 года вместе с Visual Studio 2008. Однако наибольшее количество новых возможностей языка появилось только вместе с .NET Framework 3.5.
Именно в этой версии появились автоматически реализованные свойства, которые позволили сделать объявление свойств более кратким, если в методах доступа к ним не требуется сложная логика.
Появилась возможность неявной типизации с помощью ключевого слова var
, а также анонимные типы, которые позволили инкапсулировать свойства только для чтения в один объект без необходимости явного объявления типа. Имя такого типа создаётся компилятором и недоступно на уровне исходного кода.
Появились выражения запросов, которые позволили в SQL-подобном синтаксисе описать необходимые для выполнения операции с коллекциями с помощью новых ключевых слов select
, from
и where
. Эта функциональность реализовалась компонентом LINQ.
Также появились лямбда-выражения для создания анонимных функций. Помимо этого, лямбда-выражения теперь могли представляться в виде структуры данных, доступной для обхода во время выполнения. Это позволило транслировать строго типизированные C# выражения в другие домены, например, SQL-выражения.
Появились методы расширения, которые позволили добавить методы в существующие типы без необходимости создания нового производного типа, перекомпиляции или любого другого изменения расширяемого типа.
Также в новой версии языка добавили инициализаторы объектов, которые позволили присваивать значения всем доступным полям и свойствам объекта при его создании без вызова конструктора.
2010-2012 – C# 4.0 и C# 5.0
Превью четвёртой версии C# вышло ещё в 2008 году вместе с превью Visual Studio 2010, но полноценно новая версия языка появилась лишь в апреле 2010 года.
В этом обновлении появилась возможность использования динамических типов. Это стало полезным нововведением для создания сборок COM взаимодействия для приложения при развёртывании. Для этого появилось ключевое слово dynamic
, указывающее, что использование переменной и ссылок на её члены обходит проверку типа во время компиляции.
Добавили именованные и опциональные параметры. С помощью именованных можно было задать конкретное имя параметра, чтобы ориентироваться не только на его позицию в списке передаваемых функции аргументов. Опциональные параметры позволили опускать аргументы для некоторых параметров функции.
Появились контракты — описания правил взаимодействия сущностей друг с другом в рамках кода. Эти правила помогают установить чёткие ожидания относительно того, как должна работать программа, что облегчает её тестирование, отладку и дальнейшую поддержку.
Также в этой версии языка появилась библиотека параллельных задач TPL, концепция задач и классы Task
, TaskFactory
, Parallel
.
Было добавлено пространство имён System.Collections.Concurrent
и новые классы параллельных коллекций (например, ConcurrentQueue
), которые предоставили не только лучшую эффективность, но и более полную потокобезопасность.
В 2012 же году вышла версия C# 5.0, почти все нововведения которой были направлены на концепцию асинхронности:
появились ключевые слова
async
иawait
;были добавлены атрибуты caller info, которые позволили легко получать сведения о контексте, в котором выполняется работа, не прибегая к тонне шаблонного кода рефлексии.
2015 — C# 6.0
Следующая версия языка была выпущена вместе с Visual Studio 2015.
В этой версии появилось множество изменений, целью которых было сделать программирование на языке C# более продуктивным. Например, появились null
-условные операторы ?.
и ?[ ]
, возможность импорта статических функций типов (для доступа к статическим членам типов теперь не нужно было указывать полное имя типа).
В try
-catch
добавили возможность устанавливать условия, при которых будет исполняться блок catch
с помощью ключевого слова when
. Также внутри блоков catch
и finally
стало возможно использование await
.
Автосвойства в этой версии языка получили возможность быть инициализированными при объявлении, а также теперь можно было объявлять get
без set
метода.
Появились expression-bodied функции, т. е. определять метод теперь можно было с помощью лямбда-синтаксиса.
Добавили интерполяцию строк, которая позволила размещать код прямо в строке вместо использования String.format
. Для этого достаточно было поставить $
перед строкой.
Был добавлен новый оператор nameof
, который позволил получить короткое название типа в строковом формате.
Стало возможным инициализировать не только объекты и коллекции, но и словари с помощью инициализаторов индексов.
Начиная с этой версии C#, компилятор Roslyn был выпущен как сервис. Теперь компилятор C# был написан на C#, и у разработчиков появилась возможность использовать его в своих программах.
Тот же год: PVS-Studio научился анализировать C# проекты
22 декабря 2015 года вышла версия PVS-Studio 6.00, в которой появился статический анализатор кода для языка C#. После релиза инструмент уже содержал более 40 диагностических правил.
Уже к июню 2016 в анализаторе было более 100 диагностик. Для сравнения, C++ анализатор PVS-Studio достиг такого количества диагностик за 19 месяцев, когда C# команда справилась за 10. Однако обусловлено это большим размером команды и использованием Roslyn Code Analysis Framework.
В 2021 году в C# анализаторе PVS-Studio появились механизмы для проведения taint-анализа, позволяющего искать в исходном коде дефекты безопасности, связанные с обработкой внешних данных: SQL-инъекции, XXS, XXE и другие. Также появился механизм для проведения композиционного анализа (SCA, Software Composition Analysis) — поиска уязвимостей в используемых third-party компонентах.
В 2023 году в C# анализаторе PVS-Studio появилась новая группа диагностик, направленная на оптимизации исходного кода проектов, использующих движок Unity.
Примечание. Узнать больше о PVS-Studio и попробовать инструмент в своей работе можно по этой ссылке.
2017 — C# 7.0
Новая версия C# вышла в марте 2017 вместе с релизом Visual Studio 2017. Она предоставила несколько изменений, которые стали прямым дополнением для нововведений из прошлой версии.
Появились out
переменные, которые позволили объявить переменные сразу в вызове метода. Их областью видимости стал внешний блок.
Появился тип кортеж значений (ValueTuple
), а также возможность распаковывать кортежи с помощью новой синтаксической конструкции — деконструктора.
Появилось понятие шаблона (pattern
) — синтаксической конструкции, которая позволила проверить соответствие переменной определённой форме и извлечь из неё информацию.
Ключевое слово is
было расширено, чтобы дать возможность использовать его не только с типами, но и с шаблонами.
Также был расширен функционал конструкций switch
-case
: их теперь можно было использовать с любыми типами (не только примитивными). В case
появилась возможность использовать шаблоны, а также добавлять к ним дополнительные условия с помощью ключевого слова when
(в предыдущей версии такая же возможность была добавлена к блокам catch
).
Появились локальные функции, которые могли определяться внутри другой функции и были доступны только в её внутренней области видимости.
Была расширена функциональность ключевого слова ref
: появились так называемые ссылочные переменные (переменные, которые ссылаются на другие переменные), а также стало возможно возвращать ссылку на переменную с помощью инструкции return
с ref
.
Появились выражения throw
, которые позволили бросать исключения. Теперь их можно было использовать в expression-bodied функциях.
Произошли изменения и в литералах: появились бинарные литералы, а в числовых литералах появился символ разделителя _
.
Уже в августе 2017 вышел C# версии 7.1, и это не стало последним дополнением. В ноябре 2017 и мае 2018 также вышли версии языка 7.2 и 7.3 соответственно. В них также добавили новые функции различного масштаба.
Например, появилась возможность сделать функцию Main
(точку входа в приложение) асинхронной, если она возвращает объект Task
. Добавили литеральные выражения по умолчанию — возможность указать значение default
, которое при выполнении будет означать стандартное значение этого типа.
Также были внесены изменения для повышения производительности и улучшения существующей функциональности языка.
2018 — Blazor
В 2017 году на конференции NDC Oslo Стив Сандерсон, инженер Microsoft, представил экспериментальный фреймворк Blazor, предназначенный для разработки клиентских веб-приложений на платформе .NET. Он продемонстрировал, как с использованием C# и Razor-синтаксиса можно создавать интерактивные компоненты, которые компилируются в .NET сборки и выполняются в браузере через WebAssembly с помощью открытого .NET рантайма DotNetAnywhere. Название Blazor образовано от слияния слов Browser и Razor.
Blazor стал проектом с открытым исходным кодом. В 2018 году в составе .NET Core 3.1 был выпущен Blazor Server, позволяющий обновлять клиентский браузер через WebSockets с серверной стороны. Позже появился Blazor WebAssembly, использующий Mono .NET Runtime для работы с WebAssembly.
В 2023 году, с выходом .NET 8, Blazor на стороне сервера получил значительные обновления, которые позволили использовать его для создания серверных страниц (SSR), став альтернативой MVC Razor Pages. Теперь разработчики могли выбирать, будет ли компонент интерактивным и где именно он будет выполняться: на сервере или в браузере через WebAssembly. Эти варианты рендеринга получили название Interactive Render Modes.
2019 — C# 8.0
В сентябре 2018 вышла версия C# 8.0. Это обновление было предназначено для .NET Core. Некоторые функции использовали новые возможности среды CLR, а другие — типы библиотек, добавленные только в .NET Core.
В этой версии появился модификатор readonly
, указывающий, что метод не изменит состояние.
В интерфейсах теперь можно было объявить реализацию по умолчанию.
Также был улучшен механизм сопоставления шаблонов:
появились рекурсивные шаблоны, которые являлись выражением шаблона, применяемым к результатам другого выражения шаблона;
в
switch
выражениях появилась возможность сократить количествоcase
,break
и фигурных скобок;появились шаблоны свойств и шаблоны кортежей.
Было добавлено объявление using
, гарантирующее правильное использование экземпляра IDisposable
.
Ещё были изменения, связанные с async
/await
. Появились IAsyncEnumerable
и конструкция foreach
с await
. Также появились асинхронные освобождаемые типы, реализующие интерфейс System.IAsyncDisposable
.
Нововведения были в индексах и диапазонах. В частности, добавили операторы ^
и ..
, а также System.Index
и System.Range
.
Был добавлен оператор присваивания объединения с null
— ??=
, который использовали для присваивания правого операнда левому в том случае, если левый операнд равен null
.
Появились неуправляемые сконструированные типы. Сконструированный тип значения является неуправляемым, если он содержит поля исключительно неуправляемых типов (например, универсальный тип <T>
).
2020 — C# 9
В ноябре 2020 года вышел C# 9. Выпущен он был вместе с релизом .NET 5. Также эта версия языка использовалась по умолчанию для любой сборки с .NET 5.
Появился новый ссылочный тип record
, который являлся иммутабельным по умолчанию. В отличие от других ссылочных типов, записи считаются равными, если равны типы и значения их свойств и полей. Также запись может быть унаследована от записи, но не может быть унаследована от класса (как и класс не может быть унаследован от записи). Для экземпляра записи есть возможность создать копии с изменёнными значениями указанных свойств и полей при использовании ключевого слова with
.
Появилось ключевое слово init
, которое определяло метод доступа в свойстве или индексаторе и использовалось для задания значений класса при инициализации.
Начиная с этой версии языка, операторы верхнего уровня позволяли создавать программы, минуя стандартные ритуалы создания namespace
'ов, классов и методов. Теперь компилятор самостоятельно создавал класс Program
с методом точки входа для приложения. Одно приложение могло иметь только один файл с операторами верхнего уровня.
В этой версии продолжились улучшения механизма сопоставления шаблонов. Были добавлены:
шаблоны типов — шаблоны, соответствующие объекту заданного типа;
логические шаблоны — входные данные должны соответствовать заданной логической операции (
and
,or
,not
);реляционные шаблоны — входные данные должны соответствовать заданной операции сравнения с константой (больше, меньше, равно, больше или равно, меньше или равно).
Произошёл целый ряд изменений, связанных с улучшением производительности и взаимодействия. Появились целые числа нативного размера для использования в низкоуровневых библиотеках, указатели функций, возможность отключения флага localsinit
, инициализаторы модулей и новые функции для частичных методов.
Также произошли изменения, направленные на улучшение производительности разработчиков и чтения и написания кода. Например:
выражения вида
new()
;анонимные функции
static
;условные выражения целевого типа;
поддержка расширения
GetEnumerator()
для цикловforeach
;лямбда-выражения могли объявлять discard-параметры;
атрибуты могли применяться к локальным функциям.
Примечание. Мы выпускали полноценную статью с разбором нововведений C# 9. Прочитать её можно по этой ссылке.
Тот же год: .NET Core эволюционирует в .NET
В 2015 году появился .NET Core 1.0 preview — первая версия новой реализации .NET от Microsoft. Новая реализация вышла в Open Source, когда .NET Framework, являвшийся на тот момент актуальным, имел лишь некоторые компоненты с открытым исходным кодом. Хотя, конечно же, главным отличием .NET Core от .NET Framework стала его кроссплатформенность.
Последняя версия .NET Framework 4.8 вышла в 2019 году, после чего поддержка .NET Framework прекратилась, а .NET Core в 2020 году сменил название на .NET и начал поддерживать абсолютно новые функции, которых ранее не было в .NET Framework.
2021 — C# 10
Юбилейная версия языка вышла в ноябре 2021 года.
В этой версии произошли улучшения структур. Например, возможность инициализации полей непосредственно в теле структуры или поддержка параметров по умолчанию. Также появились структуры записей.
Были добавлены обработчики интерполированных строк — типы, которые конвертируют интерполированную строку в результирующую. Теперь компилятор проверял, соответствует ли интерполированная строка типу, который удовлетворяет шаблону обработчика одноименных строк.
Появилась файловая область видимости пространства имён: теперь можно было объявить namespace
для всего файла, что уменьшало количество отступов в коде и повышало его читаемость.
Добавили новые возможности для сопоставления шаблонов, включая шаблоны списков, и возможность использовать шаблоны в операторах switch
и if
.
Произошло несколько изменений, связанных с лямбда-выражениями. Например, теперь лямбда-выражения могли объявлять тип возвращаемого значения. Также стало возможным применять атрибуты к лямбда-выражениям.
Была улучшена работа с асинхронными методами, включая более эффективное управление памятью и потоками.
Примечание. Мы выпускали полноценную статью с разбором нововведений C# 10. Прочитать её можно по этой ссылке.
2022 — C# 11
Следующая версия C# вышла в ноябре 2022 года.
В этой версии появились некоторые изменения для поддержки универсальной математики:
static abstract
иstatic virtual
;оператор
unsigned shift left
;ослабленные требования к операторам сдвига.
Благодаря этим изменениям интерфейсы по типу System.IAdditionOperators<TSelf, TOther, TResult>
позволили реализовывать математические операции.
Появились "сырые" строки, которые похожи на идентификатор @
, но с некоторыми отличиями:
при разбиении на несколько строк все пробелы, предшествующие закрывающим кавычкам, удалялись из итоговой строки;
появилась возможность буквально интерпретировать кавычки (и фигурные скобки при интерполяции).
Также выражение внутри интерполяции теперь можно было переносить на новую строчку.
Появился модификатор required
, который позволил обязать инициализировать поля и свойства внутри конструктора или инициализатора.
В структурах появилась возможность инициализации их членов со значениями по умолчанию.
Улучшение сопоставления шаблонов в этой версии коснулось списков и массивов. Теперь его можно было использовать и для этих типов.
nameof
с этой версии научился захватывать имена параметров при использовании в атрибуте на методе или параметре.
Примечание. Мы выпускали полноценную статью с разбором нововведений C# 11. Прочитать её можно по этой ссылке.
Тот же год: MAUI
В 2022 году вышел Open Source фреймворк MAUI, который позволил разрабатывать как графический интерфейс пользователя (GUI), так и бизнес-логику приложения с использованием XAML и C#. При этом GUI описывался единообразно для разных платформ с помощью XAML-файлов. Также в фреймворке появилась возможность использовать специфические для платформы элементы управления.
Платформа .NET MAUI содержала движок для создания макетов, который использовался для проектирования страниц с различными элементами навигации, такими как выпадающие меню или панели. Ещё одной особенностью стала интегрированная привязка данных, поддерживающая более элегантные и управляемые шаблоны проектирования. Настройка обработчиков событий стала более гибкой, что позволяло улучшить отображения элементов интерфейса.
Кроме того, .NET MAUI предоставил кроссплатформенные API для доступа к нативным функциям устройств, таким как GPS, акселерометры, а также данные о заряде батареи и статусе сети. Платформа вышла с поддержкой кроссплатформенной графики, позволив рисовать формы, изображения и поддерживать графические трансформации объектов.
2023 — C# 12
Новая версия C# была выпущена в ноябре 2023 года и привнесла несколько значительных улучшений и нововведений в язык.
Одним из самых заметных изменений стало введение возможности определять первичный конструктор прямо в объявлении класса или структуры. Это упростило создание объектов, так как теперь не нужно было создавать отдельный конструктор для инициализации свойств, если они могли быть заданы в момент объявления.
Также была улучшена работа с коллекциями. Синтаксис стал более лаконичным и напоминал тот, который ранее использовался для массивов, только с квадратными скобками вместо фигурных. Такой подход делал код более читаемым и компактным. В дополнение к этому был добавлен новый оператор расширения ..
, который значительно упростил процесс конкатенации коллекций.
Ещё одной полезной фичей стало улучшение параметров анонимных функций. Теперь параметры могли иметь значения по умолчанию. Также появилась возможность использовать ключевое слово params
в анонимных функциях.
Также изменения коснулись ключевого слова using
. Оно использовалось в том числе для создания псевдонимов типов, а с новой версией using
более ничем не ограничивался, что позволило работать с псевдонимами типов более свободно и удобно.
nameof
с этой версии мог захватывать экземплярные члены класса даже из статических методов, инициализаторов и атрибутов.
Одним из более технических нововведений стали inline массивы — массивы фиксированного размера, которые размещаются на стеке в непрерывном участке памяти. Это улучшение было особенно полезно для написания высокопроизводительного кода, поскольку такие массивы не требуют выделения памяти в куче. Это позволило снизить накладные расходы и ускорить выполнение.
Примечание. Мы выпускали полноценную статью с разбором нововведений C# 12. Прочитать её можно по этой ссылке.
2024 — C# 13
Самая свежая на момент написания статьи версия C# вышла в ноябре 2024 года.
В новой версии появилась возможность инициализировать объекты с помощью неявного оператора "от конца" — ^
. До этого при инициализации индексы объекта можно было указывать только "от начала".
Была расширена возможность частичного объявления и реализации содержимого классов. Теперь можно было указывать модификатор partial
свойствам и индексаторам.
В этой версии также появилась поддержка коллекций (а не только массивов) при модификаторе params
.
В пространстве имён System.Runtime.CompilerServices
появился атрибут OverloadResolutionPriorityAttribute
, с помощью которого можно явно указывать, какая из перегрузок будет использоваться в первую очередь.
Была улучшена работа с синхронизацией потоков. На смену object
пришёл полноценный класс Lock
из пространства имён System.Threading
. Помимо улучшения читаемости кода, этот класс также предоставляет, например, поле IsHeldByCurrentThread
, указывающее на то, удерживается ли блокировка текущим потоком, а также некоторые полезные методы:
Enter()
— вход в участок блокировки;TryEnter()
— попытка моментального входа в участок блокировки, если это допустимо;возвращение результат попытки входа в виде
bool
;EnterScope()
— получение структурыScope
, которую можно применить вместе с операторомusing
;Exit()
— выход из участка блокировки.
ref struct
научились наследоваться от интерфейсов, а также было добавлено анти-ограничение allows ref struct
, которое позволило передавать в шаблонные методы экземпляры ref
структур.
В асинхронных методах появилась возможность объявлять ref
локальные переменные и экземпляры ref
структур.
Также в этой версии языка итераторы и асинхронные методы начали поддерживать модификатор unsafe
, который позволил производить любые операции с указателями. При этом в итераторах потребовался безопасный контекст для таких конструкций, как yield return
и yield break
.
Примечание. Мы выпускали полноценную статью с разбором нововведений C# 13. Прочитать её можно по этой ссылке.
Заключение
Возвращаемся в настоящее! На этом наше путешествие в историю развития и становления языка C# заканчивается.
Должен обратить ваше внимание на то, что подборка событий в нашем путешествии была основана на видении автора и может не совпадать с тем, что хотели бы увидеть вы. Но всегда можно рассказать в комментариях о других интересных, с вашей точки зрения, событиях в истории C#.
Увидимся в следующем приключении!
— Но путешествие во времени противоречит здравому смыслу!
— А что такое здравый смысл? — спросил Путешественник во Времени.
Герберт Уэллс
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Valerii Filatov. History of C#: versions, .NET, Unity, Blazor, and MAUI.