История языка C#
В этой статье содержится описание основных выпусков языка C#. Команда разработчиков C# продолжает добавлять новые функции. Сведения о состоянии функции для отдельных языков, включая функции, которые будут добавлены в предстоящие выпуски, см. в репозитории dotnet/roslyn на сайте GitHub.
Внимание
В некоторых возможностях используются типы и методы, которые в спецификации C# определены как стандартная библиотека. Платформа .NET предоставляет эти типы и методы в разных пакетах. например, обработка исключений. Каждая инструкция и выражение throw
проверяется, чтобы убедиться, что вызываемый объект является производным от Exception. Аналогичным образом каждая инструкция catch
проверяется, чтобы убедиться, что перехваченный тип является производным от Exception. В каждой версии могут добавляться новые требования. Чтобы использовать новейшие возможности языка в старой среде, может потребоваться установить определенные библиотеки. Эти зависимости описаны на странице для каждой конкретной версии. Дополнительные сведения о связи между языком и библиотекой, а также общие сведения о такой зависимости см. здесь.
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
область - Числовой intPtr
ref
поля иscoped ref
- Улучшенное преобразование групп методов для делегирования.
- Предупреждающие волны 7
C# 11 содержит универсальные математические функции и несколько функций, поддерживающих эту цель. Числовые алгоритмы можно записывать один раз для всех типов чисел. Существует больше возможностей для упрощения работы с struct
типами, такими как обязательные элементы и структуры по умолчанию. Работа со строками упрощается с необработанными строковыми литералами, новой строкой в интерполяциях строк и строковых литералах UTF-8. Такие функции, как локальные типы файлов, позволяют упростить генераторы источников. Наконец, шаблоны списков добавляют дополнительную поддержку сопоставления шаблонов.
C# версии 10
Выпущено в ноябре 2021 г.
В C# 10 добавлены следующие функции и улучшения языка C#:
- Структуры записей
- Улучшения типов структуры
- Обработчики интерполированных строк
- Директивы
global using
- Объявление пространства имен в пределах файла
- Расширенные шаблоны свойств
- Усовершенствования в лямбда-выражениях
- Разрешены интерполированные строки
const
- Типы записей могут запечатывать
ToString()
- Улучшенное определенное назначение
- Разрешено присваивание и объявление в одном и том же деконструировании
- Разрешен атрибут
AsyncMethodBuilder
в методах - Атрибут CallerArgumentExpression
- Улучшенная прагма
#line
Дополнительные возможности доступны в режиме предварительной версии . Чтобы использовать эти функции, необходимо задать <LangVersion>
значение Preview
в проекте:
- Универсальные атрибуты далее в этой статье.
- Статические абстрактные члены в интерфейсах.
C# 10 продолжает работу над темами удаления церемонии, разделения данных от алгоритмов и повышения производительности среды выполнения .NET.
Многие функции означают, что вы вводите меньше кода, чтобы выразить те же понятия. Структуры записей синтезируют многие из одинаковых методов, которые записывают классы . Структуры и анонимные типы поддерживаются выражениями. Глобальные директивы и объявления пространства имен в области файлов означают, что вы выражаете зависимости и организацию пространства имен более четко. Лямбда-улучшения упрощают объявление лямбда-выражений, где они используются. Новые шаблоны свойств и улучшения деконструкции создают более краткий код.
Новые интерполированные обработчики строк и 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
с отрицанием требуется несоответствие данного шаблона. - Реляционные шаблоны требуют, чтобы входные данные были меньше, чем, меньше или равно, или больше или равно заданной константе.
Эти шаблоны обогащают синтаксис шаблонов. Рассмотрим следующие примеры.
public static bool IsLetter(this char c) =>
c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';
С помощью дополнительных скобок можно явно указать, что and
имеет более высокий приоритет, чем or
.
public static bool IsLetterOrSeparator(this char c) =>
c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';
Одним из наиболее распространенных применений нового синтаксиса является проверка значения на null.
if (e is not null)
{
// ...
}
Любой из этих шаблонов можно использовать в любом контексте, где разрешены шаблоны: выражения с шаблоном is
, выражения switch
, вложенные шаблоны и шаблоны метки case
оператора switch
.
Высокопроизводительные вычисления на 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 во вложенных выражениях
- Улучшение интерполированных строк verbatim
Для членов интерфейса по умолчанию требуются улучшения среды 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. В этой версии добавлен элемент конфигурации выбора версии языка, три новых возможности языка и новое поведение компилятора.
Новые языковые функции в этом выпуске
- метод
async
Main
.- Точка входа для приложения может иметь модификатор
async
.
- Точка входа для приложения может иметь модификатор
- Литеральные выражения
default
- Литеральные выражения по умолчанию можно использовать в выражениях значения по умолчанию, если можно вывести тип целевого объекта.
- Выводимые имена элементов кортежа
- Имена элементов кортежа часто можно вывести из инициализации кортежа.
- Сопоставление шаблонов для параметров универсального типа
- Выражения сопоставления шаблонов можно использовать с переменными, тип которых является параметром универсального типа.
Наконец, компилятор имеет два варианта -refout
и -refonly
создание эталонной сборки.
C# версии 7.0
Выпущено за март 2017 г.
C# версии 7.0 был выпущен вместе с Visual Studio 2017. Эта версия имеет некоторые эволюционные и холодные вещи в вену C# 6.0. Ниже приведены некоторые из новых функций:
- Переменные Out
- Кортежи и деконструкция
- Сопоставление шаблонов
- Локальные функции
- Расширенные элементы, воплощающие выражение
- Ссылка на локальные параметры
- Возврат ссылок
Другие возможности:
Все эти функции предлагают новые возможности для разработчиков и возможность писать более чистый код, чем когда-либо. Важным аспектом является доработка объявления переменных путем использования ключевого слова 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
для асинхронного программирования. Ниже приведен список основных функций:
- Асинхронные члены
- Информационные атрибуты вызывающего объекта
- Проект кода. Информационные атрибуты вызывающего объекта в C# 5.0
Информационный атрибут вызывающего объекта позволяет легко получать сведения о контексте, в котором выполняется работа, не прибегая к массивному стандартному коду отражения. Он находит обширное применение в задачах диагностики и ведения журнала.
Однако настоящими звездами этого выпуска являются 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# была выражением запроса, также известным как языковой интегрированный запрос (LINQ).
Немного углубившись, можно отметить деревья выражений, лямбда-выражения и анонимные типы как основу для создания LINQ. Однако в любом случае в C# 3.0 была представлена революционная концепция. C# 3.0 начал создавать основы для превращения C# в гибридный объектно-ориентированный или функциональный язык.
Среди прочего, теперь вы можете создавать декларативные запросы в стиле SQL для выполнения операций с коллекциями. Вместо создания цикла for
для вычисления среднего значения из списка целых чисел теперь вам достаточно использовать list.Average()
. Сочетание выражений запросов и методов расширения сделало список целых чисел намного умнее.
C# версии 2.0
Выпущено в ноябре 2005 г.
Давайте рассмотрим некоторые основные возможности языка C# 2.0, выпущенного в 2005 году вместе с Visual Studio 2005:
- Универсальные шаблоны
- Разделяемые типы
- Анонимные методы
- Типы значений, допускающие значение NULL
- Итераторы
- Ковариантность и контравариантность
Другие возможности C# 2.0 расширяли существующие возможности:
- Отдельный доступ к методу получения и методу задания
- Преобразования групп методов (делегаты)
- Статические классы
- Выведение делегата
В то время как C# начался как универсальный язык объектно-ориентированного (OO), C# версии 2.0 изменился в спешке. Благодаря универсальным шаблонам вы получаете типы и методы, которые могут работать с произвольным типом, при этом обеспечивая безопасность типа. В результате, например, наличие List<T> позволяет использовать List<string>
или List<int>
и совершать типобезопасные операции с этими строками или целыми числами, выполняя итерацию по ним. Использование универсальных шаблонов лучше, чем создание типа, наследуемого ListInt
от Object
ArrayList
каждой операции или приведения от нее.
В 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).