История языка C#

В этой статье содержится описание основных выпусков языка C#. Команда разработчиков C# продолжает добавлять новые функции. Сведения о состоянии функции для отдельных языков, включая функции, которые будут добавлены в предстоящие выпуски, см. в репозитории dotnet/roslyn на сайте GitHub.

Внимание

В некоторых возможностях используются типы и методы, которые в спецификации C# определены как стандартная библиотека. Платформа .NET предоставляет эти типы и методы в разных пакетах. например, обработка исключений. Каждая инструкция и выражение throw проверяется, чтобы убедиться, что вызываемый объект является производным от Exception. Аналогичным образом каждая инструкция catch проверяется, чтобы убедиться, что перехваченный тип является производным от Exception. В каждой версии могут добавляться новые требования. Чтобы использовать новейшие возможности языка в старой среде, может потребоваться установить определенные библиотеки. Эти зависимости описаны на странице для каждой конкретной версии. Дополнительные сведения о связи между языком и библиотекой, а также общие сведения о такой зависимости см. здесь.

C# версии 12

Выпущено в ноябре 2023 г.

В C# 12 добавлены следующие функции:

И, перехватчики - выпущены в качестве функции предварительной версии.

В целом C# 12 предоставляет новые функции, которые упрощают написание кода C#. Синтаксис, который вы уже знали, доступен в других местах. Другой синтаксис обеспечивает согласованность связанных понятий.

C# версии 11

Выпущено в ноябре 2022 г.

В C# 11 добавлены следующие функции:

C# 11 содержит универсальные математические функции и несколько функций, поддерживающих эту цель. Числовые алгоритмы можно записывать один раз для всех типов чисел. Существует больше возможностей для упрощения работы с struct типами, такими как обязательные элементы и структуры по умолчанию. Работа со строками упрощается с необработанными строковыми литералами, новой строкой в интерполяциях строк и строковых литералах UTF-8. Такие функции, как локальные типы файлов, позволяют упростить генераторы источников. Наконец, шаблоны списков добавляют дополнительную поддержку сопоставления шаблонов.

C# версии 10

Выпущено в ноябре 2021 г.

В C# 10 добавлены следующие функции и улучшения языка C#:

Дополнительные возможности доступны в режиме предварительной версии . Чтобы использовать эти функции, необходимо задать <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#:

Для членов интерфейса по умолчанию требуются улучшения среды 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# более продуктивным. Вот некоторые из них:

Другие новые возможности:

  • Инициализаторы индекса
  • Выражение 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# была выражением запроса, также известным как языковой интегрированный запрос (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# начался как универсальный язык объектно-ориентированного (OO), C# версии 2.0 изменился в спешке. Благодаря универсальным шаблонам вы получаете типы и методы, которые могут работать с произвольным типом, при этом обеспечивая безопасность типа. В результате, например, наличие List<T> позволяет использовать List<string> или List<int> и совершать типобезопасные операции с этими строками или целыми числами, выполняя итерацию по ним. Использование универсальных шаблонов лучше, чем создание типа, наследуемого ListInt от ObjectArrayList каждой операции или приведения от нее.

В 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).