Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье содержится описание основных выпусков языка C#. Команда разработчиков C# продолжает добавлять новые функции. Сведения о состоянии функции для отдельных языков, включая функции, которые будут добавлены в предстоящие выпуски, см. в репозитории dotnet/roslyn на сайте GitHub. Чтобы узнать, когда определенная функция была добавлена на язык, обратитесь к файлу журнала версий C# в репозитории dotnet/csharplang на сайте GitHub.
Внимание
В некоторых возможностях используются типы и методы, которые в спецификации C# определены как стандартная библиотека. Платформа .NET предоставляет эти типы и методы в разных пакетах. например, обработка исключений. Каждая инструкция и выражение throw проверяется, чтобы убедиться, что вызываемый объект является производным от Exception. Аналогичным образом каждый элемент catch проверяется, чтобы удостовериться, что перехватываемый тип является производным от Exception. В каждой версии могут добавляться новые требования. Чтобы использовать новейшие возможности языка в старой среде, может потребоваться установить определенные библиотеки. Эти зависимости описаны на странице для каждой конкретной версии. Дополнительные сведения о связи между языком и библиотекой, а также общие сведения о такой зависимости см. здесь.
C# версии 14
Выпущено в ноябре 2025 г.
C# 14 включает следующие новые возможности:
- Члены расширения
- Условное присваивание null
-
nameofподдерживает несвязанные универсальные типы -
Более неявные преобразования для
Span<T>иReadOnlySpan<T> - Модификаторы простых лямбда-параметров
-
fieldподдерживаемые свойства -
partialсобытия и конструкторы - определяемые пользователем операторы составных назначений
C# версии 13
выпущено в ноябре 2024 г.
C# 13 включает следующие новые возможности:
-
paramsколлекции: модификаторparamsне ограничивается типами массивов. Теперь можно использоватьparamsс любым распознаваемым типом коллекции, включаяSpan<T>и типы интерфейсов. - Новый тип и семантика
lock: если целевой объект инструкцииlockявляется System.Threading.Lock, компилятор создает код для использования метода Lock.EnterScope() для ввода эксклюзивной области.ref struct, полученный из этого, поддерживает шаблонDispose()для выхода из эксклюзивной области. - Новая последовательность экранирования —
\e: вы можете использовать\eв качестве последовательности экранирования литерала символа для символаESCAPE, UnicodeU+001B. - Небольшие оптимизации для разрешения перегрузки с участием групп методов.
- Неявный доступ индексатора в инициализаторах объектов: в выражении инициализатора объекта теперь разрешен неявный оператор индекса "с конца",
^. - Вы можете использовать
refлокальные иunsafeконтексты в итераторах и асинхронных методах. - Для реализации интерфейсов можно использовать
ref structтипы. - Вы можете разрешить типы
ref structв качестве аргументов для параметров типа в обобщениях. - Частичные свойства и индексаторы теперь разрешены в
partialтипах. - Приоритет разрешения перегрузки позволяет авторам библиотек назначать одну перегрузку в качестве лучшей по сравнению с другими.
C# версии 12
Выпущено в ноябре 2023 г.
В C# 12 добавлены следующие функции:
-
Первичные конструкторы — вы можете создавать первичные конструкторы в любом
classилиstructтипе. -
Выражения коллекции — новый синтаксис для указания выражений коллекции, включая оператор spread, (
..e), чтобы развернуть любую коллекцию. -
Встроенные массивы — встроенные массивы позволяют создавать массив фиксированного размера в типе
struct. - Необязательные параметры в лямбда-выражениях — можно определить значения по умолчанию для параметров в лямбда-выражениях.
-
ref readonlyПараметры -ref readonlyпараметров обеспечивают более четкость для API, которые могут использоватьrefпараметры илиinпараметры. -
Псевдоним любого типа — команду
usingможно использовать для создания псевдонима любого типа, а не только именованных типов. - Экспериментальный атрибут — указывает экспериментальную функцию.
И, перехватчики - представлены как предварительная функция.
В целом C# 12 предоставляет новые функции, которые упрощают написание кода C#. Синтаксис, который вы уже знали, доступен в других местах. Другой синтаксис обеспечивает согласованность связанных понятий.
C# версии 11
Выпущено в ноябре 2022 г.
В C# 11 добавлены следующие функции:
- Необработанные строковые литералы.
- Поддержка универсальной математики.
- Универсальные атрибуты.
- Строковые литералы UTF-8.
- Новые строки в выражениях интерполяции строк.
- Шаблоны списка.
- Локальные типы файлов.
- Обязательные участники.
- Автоматические структуры по умолчанию.
- Сопоставление шаблона
Span<char>на константуstring. - Расширенная
nameofобласть. -
nintиuintобозначают System.IntPtr и System.UIntPtrSystem.UIntPtr, соответственно. -
refполя иscoped ref - Улучшено преобразование группы методов в делегат.
- Предупреждение волна 7
C# 11 содержит универсальные математические функции и несколько функций, поддерживающих эту цель. Числовые алгоритмы можно записывать один раз для всех типов чисел. Существует больше возможностей для упрощения работы с struct типами, такими как обязательные элементы и структуры по умолчанию. Работа со строками упрощается с необработанными строковыми литералами, новой строкой в интерполяциях строк и строковых литералах UTF-8. Такие функции, как локальные типы файлов, позволяют упростить генераторы источников. Наконец, шаблоны списков добавляют дополнительную поддержку сопоставления шаблонов.
C# версии 10
Выпущено в ноябре 2021 г.
В C# 10 добавлены следующие функции и улучшения языка C#:
- Структуры записей
- Улучшения типов структуры
- Обработчики интерполированных строк
-
Директивы
global using - Объявление пространства имен на уровне файла
- Расширенные шаблоны свойств
- Лямбда-выражения могут иметь естественно определяемый тип, где компилятор может вывести тип делегата из лямбда-выражения или группы методов.
- Лямбда-выражения могут объявлять тип возвращаемого значения , когда компилятор не может вывести его.
- атрибуты можно применять к лямбда-выражениям.
- В C# 10
constстроки можно инициализировать с помощью интерполяции строк, если все заполнители являются константными строками. - В C# 10 вы можете добавить модификатор
sealedпри переопределенииToStringв типе записи . - Предупреждения для определенного назначения и анализа состояния NULL более точны.
- Разрешить присваивание и объявление в одной деконструкции.
-
Разрешен атрибут
AsyncMethodBuilderв методах - Атрибут CallerArgumentExpression
- C# 10 поддерживает новый формат для
#linepragma.
C# 10 продолжает работу над темами удаления церемонии, разделения данных от алгоритмов и повышения производительности среды выполнения .NET.
Многие функции означают, что вы вводите меньше кода, чтобы выразить те же понятия. Структуры записей синтезируют многие те же самые методы, что и классы записей. Структуры и анонимные типы поддерживаются выражениями. Глобальные директивы using и объявления пространства имен в пределах файла означают, что вы выражаете зависимости и организацию пространства имен более четко. Лямбда-улучшения упрощают использование лямбда-выражений там, где они задействованы. Новые шаблоны свойств и улучшения деконструкции создают более краткий код.
Новые интерполированные обработчики строк и AsyncMethodBuilder поведение могут повысить производительность. Эти языковые функции были применены в среде выполнения .NET для повышения производительности в .NET 6.
C# 10 также обозначает переход на ежегодный цикл выпуска .NET. Так как не каждая функция может быть завершена в течение ежегодного периода времени, вы можете попробовать несколько функций предварительной версии в C# 10. Можно использовать как унифицированные атрибуты, так и статические абстрактные члены в интерфейсах, но эти предварительные функции могут измениться до их окончательного выпуска.
C# версии 9
Выпущено в ноябре 2020 г.
C# версии 9 был выпущен с .NET 5. Это версия языка используется по умолчанию для любой сборки, предназначенной для выпуска .NET 5. Она содержит следующие новые и улучшенные функции:
- Записи
- Только инициируемые сеттеры
- Операторы верхнего уровня
- Улучшения сопоставления шаблонов: реляционные шаблоны и логические шаблоны
- Производительность и взаимодействие
- Качество подгонки и отделки
В C# 9 получили развитие три направления предыдущих выпусков: устранение формальностей, отделение данных от алгоритмов и доступность большего количества шаблонов в большем количестве мест.
Операторы верхнего уровня упрощают чтение основной программы. Сократилась потребность в формальностях: больше не нужны ни пространства имен, Program, ни классы, ни static void Main().
Внедрение records обеспечивает краткий синтаксис для ссылочных типов, которые соответствуют семантике значений в отношении равенства. Эти типы используются для определения контейнеров данных, которые обычно определяют минимальное поведение.
Методы задания только для инициализации предоставляют возможность недеструктивной мутации (with выражений) в записях. В C# 9 также добавлены ковариантные возвращаемые типы, благодаря чему производные записи могут переопределять виртуальные методы и возвращать тип, производный от возвращаемого типа базового метода.
Возможности сопоставления шаблонов расширяются несколькими способами. Числовые типы теперь поддерживают шаблоны диапазонов. Шаблоны можно комбинировать с помощью шаблонов and, or и not. Скобки можно добавить для уточнения более сложных шаблонов:
C# 9 включает новые улучшения сопоставления шаблонов.
- Образцы типов проверяют соответствует ли объект определенному типу
- Шаблоны в круглых скобках усиливают или подчеркивают приоритет сочетаний шаблонов.
-
В конъюнктивных шаблонах
andоба шаблона должны совпадать. -
В дизъюнктивных шаблонах
orтребуется, чтобы хотя бы один из шаблонов соответствовал. - В шаблонах
notс отрицанием требуется, чтобы шаблон не совпадал. - Реляционные шаблоны требуют, чтобы входные данные были меньше, чем, меньше или равно, или больше или равно заданной константе.
Эти шаблоны обогащают синтаксис шаблонов. Одним из наиболее распространенных случаев использования является новый синтаксис для проверки значения на null.
if (e is not null)
{
// ...
}
Любой из этих шаблонов может быть использован в любом контексте, где разрешены шаблоны: выражения с шаблоном is, выражения switch, вложенные шаблоны и шаблоны метки оператора switchcase.
Высокопроизводительные вычисления на C# поддерживает еще один набор функций.
- Типы
nintиnuintмоделируют целочисленные типы собственного размера в целевом ЦП. - Указатели функций предоставляют функциональные возможности, подобные возможностям делегатов, но при этом не требуют выделения, необходимого для создания объекта-делегата.
- Инструкцию
localsinitможно опустить для сохранения инструкций.
Производительность и взаимодействие
Еще один набор улучшений поддерживает сценарии, в которых генераторы кода добавляют функциональные возможности.
- Инициализаторы модулей — это методы, которые среда выполнения вызывает при загрузке сборки.
- Частичные методы поддерживают новые модификаторы доступности и возвращаемые типы, не являющиеся void. В таких случаях необходимо предоставить реализацию.
Особенности отделки и точности
В C# 9 добавлено множество других небольших функций, улучшающих производительность разработчиков, а также написание и чтение кода:
- Выражения
newцелевого типа - Анонимные функции
static - Условные выражения целевого типа
- Расширение
GetEnumerator()поддерживает циклыforeach - Лямбда-выражения могут объявлять параметры отброса
- Атрибуты могут применяться к локальным функциям
Выпуск C# 9 — это следующий этап развития, благодаря которому C# остается современным языком программирования общего назначения. Его возможности обеспечат дальнейшую поддержку современных рабочих нагрузок и типов приложений.
C# версии 8.0
Выпущено в сентябре 2019 г.
C# 8.0 — это первый основной выпуск C#, специально предназначенный для .NET Core. Некоторые функции используют новые возможности среды CLR, другие — типы библиотек, добавленные только в .NET Core. В C# 8.0 добавлены следующие функции и улучшения языка C#:
- Члены только для чтения
- Элементы интерфейса по умолчанию
-
Улучшения сопоставления шаблонов:
- Выражения switch
- Шаблоны свойств
- Шаблоны кортежей
- Позиционные шаблоны
- Объявления using.
- Статические локальные функции.
- Удаляемые ссылочные структуры.
- Ссылочные типы, допускающие значение NULL
- Асинхронные потоки.
- Индексы и диапазоны.
- Присваивание объединения со значением NULL
- Неуправляемые сконструированные типы
- Stackalloc во вложенных выражениях
- Улучшение интерполированных строк дословного текста
Для членов интерфейса по умолчанию требуются улучшения в CLR. Эти функции были добавлены в среду CLR для .NET Core 3.0. Диапазоны, индексы и асинхронные потоки требуют новых типов в библиотеках .NET Core 3.0. Ссылочные типы, допускающие значение NULL, реализованные в компиляторе, гораздо удобнее использовать, когда библиотеки снабжаются заметками для предоставления семантической информации о состоянии NULL аргументов и возвращаемых значений. Эти заметки сейчас добавляются в библиотеки .NET Core.
C# версии 7.3
Выпущено в мае 2018 г.
Основные темы выпуска C# 7.3 можно разделить на две. Одна из них — набор функций для повышения эффективности безопасного кода до уровня небезопасного кода. Вторая — постепенные улучшения существующих функций. В этом выпуске добавлены новые параметры компилятора.
Следующие новые функции поддерживают тему улучшения производительности безопасного кода:
- Вы можете получить доступ к фиксированным полям без закрепления.
- возможность переназначать локальные переменные
ref; - Вы можете использовать инициализаторы для массивов
stackalloc. - можно использовать утверждения
fixedс любым типом, который поддерживает шаблон. - Можно использовать более универсальные ограничения.
Для существующих функций предоставлены следующие улучшения:
- Вы можете тестировать
==и!=с кортежными типами. - Вы можете использовать переменные выражений в большем количестве мест.
- Атрибуты можно прикрепить к резервному полю автоматически реализованных свойств.
- Разрешение методов при различии аргументов по
inбыло улучшено. - стало меньше неоднозначных вариантов при разрешении перегрузок.
Новые параметры компилятора:
-
-publicsignпозволяет подписывать сборки с использованием программного обеспечения с открытым исходным кодом. -
-pathmapпозволяет предоставить сопоставление для исходных каталогов.
C# версии 7.2
Выпущено в ноябре 2017 г.
В C# 7.2 добавлено несколько небольших языковых функций:
- Инициализаторы в массивах
stackalloc. - Используйте операторы
fixedс любым типом, который поддерживает шаблон. - доступ к полям фиксированной ширины без закрепления;
- Переназначьте локальные переменные
ref. - Объявите типы
readonly struct, чтобы указать, что структура является неизменяемой и должна передаваться в методы как параметрin. - добавление модификатора
inдля параметров, указывающего, что аргумент передается по ссылке, но не изменяется вызываемым методом; - использование модификатора
ref readonlyдля возвращаемого значения метода, указывающего, что метод возвращает значение по ссылке, но не допускает операции записи в соответствующий объект; - Объявляйте типы
ref struct, чтобы указать, что тип структуры обращается напрямую к управляемой памяти и всегда должен выделяться в стеке. - Используйте более универсальные ограничения.
-
Неконечные именованные аргументы:
- Позиционные аргументы могут следовать именованным аргументам.
- Ведущие символы подчеркивания в числовых литералах:
- Перед любыми печатными знаками в числовых литералах теперь могут использоваться начальные знаки подчеркивания.
-
private protectedмодификатор доступа:- Модификатор доступа
private protectedразрешает доступ для производных классов в одной сборке.
- Модификатор доступа
- Условные
refвыражения:- Результат условного выражения
?:теперь может быть ссылкой.
- Результат условного выражения
C# версии 7.1
Выпущено в августе 2017 г.
C# начали выпускать минорные релизы с C# 7.1. В этой версии добавлен элемент конфигурации выбора версии языка, три новых возможности языка и новое поведение компилятора.
Новые языковые функции в этом выпуске
-
метод
asyncMain.- Точка входа для приложения может иметь модификатор
async.
- Точка входа для приложения может иметь модификатор
-
Литеральные выражения
default- Литеральные выражения по умолчанию можно использовать в выражениях значения по умолчанию, если можно вывести тип целевого объекта.
- Предполагаемые имена элементов кортежа
- Имена элементов кортежа часто можно вывести из инициализации кортежа.
- Сопоставление шаблонов для параметров универсального типа
- Выражения сопоставления шаблонов можно использовать с переменными, тип которых является параметром универсального типа.
В заключение, компилятор имеет две опции -refout и -refonly для управления созданием эталонной сборки.
C# версии 7.0
Выпущено в марте 2017 г.
C# версии 7.0 был выпущен вместе с Visual Studio 2017. Эта версия включает некоторые эволюционные и интересные элементы в духе C# 6.0. Ниже приведены некоторые из новых функций:
- Переменные вывода
- Кортежи и деконструкция
- Сопоставление шаблонов
- Локальные функции
- Расширенные элементы, воплощающие выражение
- Ссылка на локальные параметры
- Возврат по ссылке
Другие возможности:
Все эти функции предлагают новые возможности для разработчиков и возможность писать более чистый код, чем когда-либо. Важным аспектом является упрощение объявления переменных путем использования ключевого слова out и возможность нескольких возвращаемых значений с помощью кортежей. Теперь .NET Core подходит для любой операционной системы, а также уверенно движется в направлении облачных технологий и портативности. Очевидно, что новые возможности занимают мысли и время разработчиков языков, помимо разработки новых функций.
C# версии 6.0
Выпущено в июле 2015 г.
Версия 6.0, выпущенная в Visual Studio 2015, выпустила множество небольших функций, что сделало программирование C# более продуктивным. Вот некоторые из них:
- Статические импорты
- Фильтры исключений
- Инициализаторы автосвойств
- Элементы, воплощающие выражение
- операция передачи null
- Интерполяция строк
- Оператор nameof
Другие новые возможности:
- Инициализаторы индекса
- Выражение Await в блоках Catch и Finally
- Значения по умолчанию для свойств, доступных только для чтения
Если вы посмотрите на эти функции вместе, вы увидите интересный шаблон. В этой версии C# начал устранять шаблоны языка, чтобы сделать код более удобочитаемым и доступным для чтения. Поэтому эта версия, несомненно, станет значительным преимуществом для поклонников чистого, простого кода.
Они сделали еще одну вещь вместе с этой версией, хотя это само по себе не является традиционной языковой функцией. Состоялся выпуск компилятора Roslyn в виде службы. Теперь компилятор C# написан на C#, и вы можете использовать его при программировании.
C# версии 5.0
Выпущено в августе 2012 г.
Версия C# 5.0, выпущенная вместе с Visual Studio 2012, была крайне целенаправленной. Практически все нововведения в этой версии касались другой инновационной концепции: модели async и await для асинхронного программирования. Ниже приведен список основных функций:
Информационный атрибут вызывающего объекта позволяет легко получать сведения о контексте, в котором выполняется работа, не прибегая к массивному стандартному коду отражения. Он находит обширное применение в задачах диагностики и ведения журнала.
Однако настоящими звездами этого выпуска являются async и await. После появления этих функций в 2012 году, C# снова произвела революцию, интегрировав асинхронность в язык в качестве ключевого компонента.
C# версии 4.0
Выпущено в апреле 2010 г.
C# версии 4.0, выпущенной в Visual Studio 2010, представил некоторые интересные новые возможности:
- Динамическая привязка
- Именованные/дополнительные аргументы
- Универсальная ковариантность и контравариантность
- Внедренные типы взаимодействия
Внедренные типы взаимодействия упростили сложные задачи развертывания, связанные с созданием сборок COM-взаимодействия для вашего приложения. Универсальная ковариантность и контравариантность предоставляют больше возможностей для использования универсальных шаблонов, однако эти функции несколько академичны и, вероятно, наиболее высоко оценены авторами фреймворков и библиотек. Именованные и необязательные параметры позволяют избавиться от многих перегрузок методов и упростить использование. Однако ни одна из этих функций не является кардинальным изменением.
Значимым событием стало появление ключевого слова dynamic. Благодаря ключевому слову dynamic в C# версии 4.0 появилась возможность переопределять компилятор при типизации во время компиляции. Используя это ключевое слово, вы можете создавать конструкции, характерные для языков с динамической типизацией, таких как JavaScript. Вы можете создать dynamic x = "a string" и затем добавить к нему шестёрку, оставив выполнение дальнейших действий на усмотрение среды выполнения.
Динамическое связывание подвержено ошибкам, однако открывает великолепные возможности внутри языка.
C# версии 3.0
Выпущено в ноябре 2007 г.
Версия C# 3.0 была выпущена в конце 2007 года вместе с Visual Studio 2008, однако полный набор возможностей языка был реализован в версии .NET Framework 3.5. Эта версия ознаменовала кардинальное изменение развития C#. Она доказала, что C# действительно является достойным языком программирования. Давайте рассмотрим некоторые основные возможности в этой версии:
- Автоматически реализуемые свойства
- Анонимные типы
- Выражения запросов
- Лямбда-выражения
- Деревья выражений
- Методы расширения
- Неявно типизированные локальные переменные
- Частичные методы
- Инициализаторы объектов и коллекций
Оглядываясь назад, многие из этих функций кажутся как неизбежными, так и неразрывными. Все они образуют единый и стратегически значимый набор. Главной особенностью этой версии C# было выражение запросов, также известное как Language Integrated Query (LINQ).
Немного углубившись, можно отметить деревья выражений, лямбда-выражения и анонимные типы как основу для создания LINQ. Однако в любом случае в C# 3.0 была представлена революционная концепция. C# 3.0 начал создавать основы для превращения C# в гибридный объектно-ориентированный или функциональный язык.
Среди прочего, теперь вы можете создавать декларативные запросы в стиле SQL для выполнения операций с коллекциями. Вместо создания цикла for для вычисления среднего значения из списка целых чисел теперь вам достаточно использовать list.Average(). Сочетание выражений запросов и методов расширения сделало список целых чисел намного умнее.
C# версии 2.0
Выпущено в ноябре 2005 г.
Давайте рассмотрим некоторые основные возможности языка C# 2.0, выпущенного в 2005 году вместе с Visual Studio 2005:
- Универсальные шаблоны
- Частичные типы
- Анонимные методы
- Обнуляемые типы значений
- Итераторы
- Ковариантность и контравариантность
Другие возможности C# 2.0 расширяли существующие возможности:
- Раздельный доступ к геттеру и сеттеру
- Преобразования групп методов (делегаты)
- Статические классы
- Определение делегата
В то время как C# начался как универсальный объектно-ориентированный язык (ОО), версия C# 2.0 быстро изменила это. Благодаря универсальным шаблонам вы получаете типы и методы, которые могут работать с произвольным типом, при этом обеспечивая безопасность типа. В результате, например, наличие List<T> позволяет использовать List<string> или List<int> и совершать типобезопасные операции с этими строками или целыми числами, выполняя итерацию по ним. Использование универсальных шаблонов лучше, чем создание типа, наследуемого от ArrayList, или приведение из Object для каждой операции.
В C# версии 2.0 появились итераторы. Если кратко, итераторы позволяют изучать все элементы в List (или других перечисляемых типов) с помощью цикла foreach. Наличие итераторов в качестве первоклассного компонента в языке значительно улучшило удобочитаемость языка и способность воспринимать код.
Версия для C# 1.2
Выпущено в апреле 2003 г.
Версия C# 1.2 входит в состав Visual Studio .NET 2003. Она содержит ряд небольших улучшений языка. Наиболее значительным изменением является то, что начиная с этой версии код, создаваемый в цикле foreach, вызывает Dispose в IEnumerator, если IEnumerator реализует IDisposable.
C# версии 1.0
Выпущено в январе 2002
Если взглянуть на C# версии 1.0, выпущенный вместе с Visual Studio .NET 2002, станет очевидно его сходство с Java. В рамках заявленных целей проектирования ECMA он стремился быть "простым, современным, объектно-ориентированным языком общего назначения". На тот момент, похожесть на Java означала, что он достиг этих ранних целей проектирования.
Однако если взглянуть на C# 1.0 сейчас, вы могли бы немного головокружиться. В этой версии не было встроенных асинхронных возможностей и некоторых изысканных функций работы с обобщениями, которые вы принимаете как должное. Фактически, в ней вообще не было универсальных шаблонов. А LINQ? Пока недоступно. Эти дополнения потребуют несколько лет, чтобы появиться.
По современным меркам C# версии 1.0 не предоставлял практически никаких возможностей. Вам пришлось бы писать довольно подробный код. Однако надо же было с чего-то начинать. C# версии 1.0 был достойной альтернативой Java на платформе Windows.
Основные возможности C# 1.0 включали следующие компоненты:
Статьяизначально опубликована в блоге NDepend, с разрешения Эрика Дитриха (Erik Dietrich) и Патрика Смачиа (Patrick Smacchia).