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

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

Важно!

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

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

C# версии 1.0

Если взглянуть на 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 включали следующие компоненты:

Версия для C# 1.2

Версия C# 1.2 входит в состав Visual Studio .NET 2003. Она содержит ряд небольших улучшений языка. Наиболее значительным изменением является то, что начиная с этой версии код, создаваемый в цикле foreach, вызывает Dispose в IEnumerator, если IEnumerator реализует IDisposable.

C# версии 2.0

Вот теперь все становится гораздо интереснее. Давайте рассмотрим некоторые основные возможности языка C# 2.0, выпущенного в 2005 году вместе с Visual Studio 2005:

Другие возможности C# 2.0 расширяли существующие возможности:

  • Отдельный доступ к методу получения и методу задания
  • Преобразования групп методов (делегаты)
  • Статические классы
  • Выведение делегата

Хотя сначала C# и был универсальным объектно-ориентированным языком, в C# версии 2.0 все кардинально изменилось. Нащупав опору под ногами, команда уделила внимание решению серьезных проблем, с которыми сталкивались разработчики. И они подошли к делу с огоньком.

Благодаря универсальным шаблонам вы получаете типы и методы, которые могут работать с произвольным типом, при этом обеспечивая безопасность типа. В результате, например, наличие List<T> позволяет использовать List<string> или List<int> и совершать типобезопасные операции с этими строками или целыми числами, выполняя итерацию по ним. Использовать универсальные шаблоны удобнее, чем создавать тип ListInt, производный от ArrayList, или выполнять приведение из Object для каждой операции.

В C# версии 2.0 появились итераторы. Если кратко, итераторы позволяют изучать все элементы в List (или других перечислимых типов) с помощью цикла foreach. Наличие итераторов в качестве первоклассного компонента в языке значительно улучшило удобочитаемость языка и способность воспринимать код.

А еще C# продолжил играть в салки с Java. Для Java уже были выпущены версии, включающие универсальные шаблоны и итераторы. Но вскоре этому было суждено измениться, так как языки продолжили развиваться независимо.

C# версии 3.0

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# версии 4.0

Разработчикам версии C# 4.0, выпущенной вместе с Visual Studio 2010, пришлось приложить серьезные усилия, чтобы не отставать от новаторской версии 3.0. С появлением версии 3.0 язык C# смог выйти из тени Java и занять доминирующее положение. Он быстро становился утонченным и элегантным.

Следующая версия представила ряд интересных функций:

Внедренные типы взаимодействия помогли сделать развертывание более удобным. Универсальная ковариантность и контравариантность расширяют возможности применения универсальных шаблонов, однако эти функции несколько академичны и высоко оценены авторами, создающими платформы и библиотеки. Именованные и дополнительные параметры позволяют избавиться от многих перегрузок методов и сделать работу более удобной. Однако ни одна из этих функций не является кардинальным изменением.

Значимым событием стало появление ключевого слова dynamic. Благодаря ключевому слову dynamic в C# версии 4.0 появилась возможность переопределять компилятор при типизации во время компиляции. Используя это ключевое слово, вы можете создавать конструкции, характерные для языков с динамической типизацией, таких как JavaScript. Вы можете создать dynamic x = "a string" и добавить туда шестерку, отложив решение о дальнейших действиях во времени выполнения.

Динамическое связывание подвержено ошибкам, однако открывает великолепные возможности внутри языка.

C# версии 5.0

Версия C# 5.0, выпущенная вместе с Visual Studio 2012, была крайне целенаправленной. Практически все нововведения в этой версии касались другой инновационной концепции: модели async и await для асинхронного программирования. Ниже приведен список основных функций:

См. также

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

Однако настоящими звездами этого выпуска являются async и await. После появления этих функций в 2012 г. C# удалось снова взять быка за рога, первоклассным образом внедрив асинхронность в язык. Если вы когда-либо сталкивались с длительными операциями и реализацией переплетающихся обратных вызовов, эта возможность, скорее всего, вам понравится.

C# версии 6.0

Версии 3.0 и 5.0 добавили в объектно-ориентированный язык C# несколько впечатляющих возможностей. Версия 6.0, выпущенная вместе с Visual Studio 2015, отступает от подхода, ориентированного на реализацию уникальных возможностей. Здесь предоставляются менее масштабные функции, с которыми программирование на C# становится гораздо эффективнее. Вот некоторые из них:

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

  • Инициализаторы индекса
  • Выражение Await в блоках Catch и Finally
  • Значения по умолчанию для свойств метода получения

Каждая из этих функций интересна сама по себе. Но если взглянуть на них вместе, заметна интересная особенность. В этой версии C# избавился от стандартного текста, чтобы сделать код более сжатым и удобочитаемым. Поэтому эта версия, несомненно, привлечет сторонников простого и понятного кода.

Еще одно новшество, связанное с этой версией, не является функцией языка в обычном понимании. Состоялся выпуск компилятора Roslyn в виде службы. Теперь компилятор C# написан на C#, и вы можете использовать его при программировании.

C# версии 7.0

C# версии 7.0 был выпущен вместе с Visual Studio 2017. В этой версии получили развитие некоторые функции из версии C# 6.0, однако компилятор в виде службы отсутствует. Ниже приведены некоторые из новых функций:

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

Все это предоставляет разработчиком множество новых возможностей и позволяет писать более понятный код. Важным аспектом является доработка объявления переменных путем использования ключевого слова out и поддержки нескольких возвращаемых значений благодаря кортежу.

Но при этом сфера применения C# продолжает расширяться. Теперь .NET Core подходит для любой операционной системы, а также уверенно движется в направлении облачных технологий и портативности. Очевидно, что разработчики активно занимаются этими новыми возможностями наравне с добавлением новых функций.

C# версии 7.1

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

Новые языковые функции в этом выпуске

Наконец, у компилятора есть два параметра -refout и -refonly, которые управляют созданием базовой сборки.

C# версии 7.2

В C# 7.2 добавлено несколько небольших языковых функций:

C# версии 7.3

Новые возможности в выпуске C# 7.3 можно разделить на две основные группы. Одна из них — набор функций для повышения эффективности безопасного кода до уровня небезопасного кода. Вторая — постепенные улучшения существующих функций. Кроме того, в этом выпуске добавлены новые параметры компилятора.

В ту группу, которая отвечает за повышение производительности безопасного кода, входят следующие новые возможности:

Для существующих функций предоставлены следующие улучшения:

  • возможность проверить == и != с типами кортежа;
  • больше мест для использование переменных выражений;
  • возможность подключить атрибуты к резервному полю автоматически реализуемых свойств;
  • улучшенное разрешение методов, аргументы которых отличаются модификатором in;
  • стало меньше неоднозначных вариантов при разрешении перегрузок.

Новые параметры компилятора:

  • -publicsign позволяет включить подписывание сборок как программного обеспечения с открытым кодом;
  • -pathmap позволяет предоставить сопоставление для исходных каталогов.

C# версии 8.0

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.

Статья изначально опубликована в блоге NDepend , с разрешения Эрика Дитриха (Erik Dietrich) и Патрика Смачиа (Patrick Smacchia).