C Sharp (язык программирования) - C Sharp (programming language) - Wikipedia

C #
C Sharp wordmark.svg
ПарадигмаСтруктурированный, императив, объектно-ориентированный, событийный, ориентированный на задачу, функциональный, общий, отражающий, одновременный
СемьяC
РазработаноMicrosoft
РазработчикMicrosoft
Впервые появился2000; 20 лет спустя (2000)[1]
Стабильный выпуск
9.0[2] / 10 ноября 2020 г.; 36 дней назад (2020-11-10)
Печатная дисциплинаСтатический, динамичный,[3] сильный, безопасный, именительный падеж, частично предполагаемый
ПлатформаИнфраструктура общего языка
Лицензия
Расширения имени файла.cs, .csx
Интернет сайтcsharp.сеть
Основной реализации
Visual C #, .NET Framework, Мононуклеоз, .NET Core, DotGNU (снято с производства), Универсальная платформа Windows
Диалекты
, Спецификация #, Полифонический C #, Улучшенный C #
Под влиянием
C ++,[6] , Эйфель, F #,[а] Haskell, Значок, J #, J ++, Ява,[6] ML, Модула-3, Object Pascal,[7] Ржавчина, VB
Под влиянием
Часовня,[8] Clojure,[9] Кристалл,[10] D, J #, Дротик,[11] F #, Взломать, Ява,[12][13] Котлин, Nemerle, Кислород, Звенеть,[14] Ржавчина, Быстрый,[15] Вала, Машинопись

C # (произносится видеть резкое, как музыкальная нота C♯, но написано с числовой знак )[b] универсальный, язык программирования с несколькими парадигмами включая статическую типизацию, строгая типизация, лексически ограниченный, императив, декларативный, функциональный, общий, объектно-ориентированный (учебный класс на основе), и компонентно-ориентированный дисциплины программирования.[16]

C # был разработан около 2000 г. Microsoft как часть его .СЕТЬ инициативу и позже одобрен как Международный стандарт к Экма (ECMA-334) в 2002 г. и ISO (ISO / IEC 23270) в 2003 году. Он был разработан Андерс Хейлсберг, и его команду разработчиков в настоящее время возглавляет Мадс Торгерсен, являющийся одним из языков программирования, предназначенных для Инфраструктура общего языка (CLI). Самая последняя версия - 9.0, выпущенная в 2020 году в .NET 5.0 и включенная в Visual Studio 2019 версия 16.8.0[17][18]

Мононуклеоз это бесплатный проект с открытым исходным кодом для разработки кросс-платформенный компилятор и среда выполнения (т.е. виртуальная машина ) для языка.

Цели дизайна

Стандарт Ecma перечисляет следующие цели проектирования для C #:[16]

История

Во время разработки .NET Framework библиотеки классов изначально были написаны с использованием управляемый код система компилятора называется "Простой управляемый C" (SMC).[19][20] В январе 1999 г. Андерс Хейлсберг сформировал команду, которая в то время создала новый язык под названием Cool, который обозначал "C-подобный Объектно-ориентированный язык ».[21] Microsoft рассматривала возможность сохранения названия «Cool» в качестве окончательного названия языка, но решила не делать этого по причинам, связанным с товарным знаком. К тому времени, когда проект .NET был публично объявлен на июльской конференции 2000 г. Конференция профессиональных разработчиков, язык был переименован в C #, а библиотеки классов и ASP.NET среда выполнения была перенесена на C #.

Хейлсберг - главный разработчик C # и ведущий архитектор в Microsoft, ранее участвовал в разработке Турбо Паскаль, Embarcadero Delphi (ранее CodeGear Delphi, Inprise Delphi и Borland Delphi) и Visual J ++. В интервью и технических статьях он заявлял, что недостатки[22] на большинстве основных языков программирования (например, C ++, Ява, Delphi, и Болтовня ) привел к основам общеязыковая среда выполнения (CLR), что, в свою очередь, положило начало разработке самого языка C #.

Джеймс Гослинг, создавший Ява язык программирования в 1994 году и Билл Джой, соучредитель Sun Microsystems, создатель Java, назвал C # «имитацией» Java; Гослинг далее сказал, что «[C #] является разновидностью Java, в которой удалены надежность, производительность и безопасность».[23][24] Клаус Крефт и Анжелика Лангер (авторы книги о потоках C ++) заявили в своем блоге, что «Java и C # - почти идентичные языки программирования. Скучное повторение без инноваций»,[25] «Вряд ли кто-нибудь будет утверждать, что Java или C # являются революционными языками программирования, изменившими способ написания программ» и «C # многое позаимствовал у Java - и наоборот. Теперь, когда C # поддерживает заниматься боксом и распаковка, у нас будет очень похожая функция в Java ".[26]В июле 2000 года Хейлсберг заявил, что C # «не является клоном Java» и «намного ближе к C ++» по своей конструкции.[27]

С момента выпуска C # 2.0 в ноябре 2005 года языки C # и Java развивались по все более расходящимся траекториям, превратившись в два совершенно разных языка. Одним из первых значительных изменений стало добавление дженерики для обоих языков с совершенно разными реализациями. C # использует овеществление для предоставления универсальных объектов "первого класса", которые можно использовать, как и любой другой класс, с генерация кода выполняется во время загрузки класса.[28]Кроме того, в C # добавлено несколько основных функций для программирования в функциональном стиле, кульминацией которых стало создание LINQ расширения, выпущенные с C # 3.0 и поддерживающая его среда лямбда-выражения, методы расширения, и анонимные типы.[29] Эти функции позволяют программистам на C # использовать методы функционального программирования, такие как закрытие, когда это выгодно для их применения. Расширения LINQ и функциональный импорт помогают разработчикам сократить количество шаблонный код который включен в общие задачи, такие как запрос к базе данных, анализ XML-файла или поиск в структуре данных, смещение акцента на фактическую логику программы, чтобы помочь улучшить читаемость и удобство обслуживания.[30]

В C # раньше был талисман называется Энди (названный в честь Андерса Хейлсберга). Списан 29 января 2004 года.[31]

C # изначально был представлен на рассмотрение подкомитету ISO JTC 1 / SC 22,[32] согласно ISO / IEC 23270: 2003,[33] был отозван и затем утвержден в соответствии с ISO / IEC 23270: 2006.[34] 23270: 2006 отозван в соответствии с 23270: 2018 и утвержден с этой версией.[35]

Имя

Microsoft впервые использовала название C # в 1988 году для варианта языка C, предназначенного для инкрементной компиляции.[36] Этот проект не был завершен, но имя живет.

Название «До-диез» было навеяно нотной грамотой, в которой острый символ указывает, что письменная запись должна быть сделана полутон выше в подача.[37]Это похоже на название языка C ++, где «++» указывает, что переменная должна быть увеличена на 1 после оценки. Острый символ также напоминает лигатура из четырех символов «+» (в сетке два на два), что дополнительно означает, что язык является инкрементом C ++.[38]

Из-за технических ограничений отображения (стандартные шрифты, браузеры и т. Д.) И того факта, что острый символ (U + 266F МУЗЫКАЛЬНЫЙ ОСТРЫЙ ЗНАК (HTML♯ · &острый;)) нет на большинстве раскладки клавиатуры, то числовой знак (U + 0023 # НОМЕРНЫЙ ЗНАК (HTML# · & num;)) был выбран для приближения острого символа в письменном названии языка программирования.[39]Это соглашение отражено в спецификации языка C # ECMA-334.[16]

Суффикс «острый» использовался в ряде других языков .NET, которые являются вариантами существующих языков, включая J # (язык .NET, также разработанный Microsoft, производный от Java 1.1), A # (из Ада ), а функциональное программирование язык F #.[40] Оригинальная реализация Eiffel для .NET назывался Eiffel #,[41] имя вышло на пенсию с момента полного Эйфель язык теперь поддерживается. Суффикс также использовался для библиотеки, Такие как Gtk # (Чистая обертка за GTK + и другие ГНОМ библиотеки) и Какао# (обертка для Какао ).

Версии

ВерсияСпецификация языкаДата.СЕТЬVisual Studio
ЭкмаISO / IECMicrosoft
C # 1.0Декабрь 2002 г.Апрель 2003 г.Январь 2002Январь 2002.NET Framework 1.0Visual Studio .NET 2002
C # 1.1
C # 1.2
Октябрь 2003 г.Апрель 2003 г..NET Framework 1.1Visual Studio .NET 2003
C # 2.0Июнь 2006 г.Сентябрь 2006 г.Сентябрь 2005 г.[c]Ноябрь 2005 г..NET Framework 2.0
.NET Framework 3.0
Visual Studio 2005
Visual Studio 2008
C # 3.0НиктоАвгуст 2007 г.Ноябрь 2007 г..NET Framework 2.0 (кроме LINQ)[42]

.NET Framework 3.0 (кроме LINQ)[42]
.NET Framework 3.5

Visual Studio 2008
C # 4.0Апрель 2010 г.Апрель 2010 г..NET Framework 4Visual Studio 2010
C # 5.0Декабрь 2017 г.Декабрь 2018 г.июнь 2013Август 2012 г..NET Framework 4.5Visual Studio 2012
Visual Studio 2013
C # 6.0НиктоПроектИюль 2015 г..NET Framework 4.6
.NET Core 1.0
.NET Core 1.1
Visual Studio 2015
C # 7.0Предложение по спецификацииМарт 2017 г..NET Framework 4.7Visual Studio 2017 версия 15.0
C # 7.1Предложение по спецификацииАвгуст 2017 г..NET Core 2.0Visual Studio 2017 версия 15.3[43]
C # 7.2Предложение по спецификацииНоябрь 2017 г.Visual Studio 2017 версия 15.5[44]
C # 7.3Предложение по спецификацииМай 2018.NET Core 2.1
.NET Core 2.2
.NET Framework 4.8
Visual Studio 2017 версия 15.7[44]
C # 8.0Предложение по спецификацииСентябрь 2019.NET Core 3.0
.NET Core 3.1
Visual Studio 2019 версия 16.3[45]
C # 9.0Предложение по спецификацииСентябрь 2020.NET 5.0Visual Studio 2019 версия 16.8, предварительная версия 4[45]

Новые возможности

C # 2.0 (2005 г.)
C # 3.0 (2007)
C # 4.0 (2010)
  • Динамическое связывание[49]
  • Именованные и необязательные аргументы[49]
  • Общая ко- и контравариантность[49]
  • Встроенные типы взаимодействия («NoPIA»)[49]
C # 5.0[50] (2012)
C # 6.0 (2015)
  • Компилятор как услуга (Рослин )
  • Импорт членов статического типа в пространство имен[52]
  • Фильтры исключений[52]
  • Ожидание в блоках catch / finally[52]
  • Автоматические инициализаторы свойств[52]
  • Значения по умолчанию для свойств только для получения[52]
  • Члены с телом выражения[52]
  • Нулевой пропагатор (нулевой условный оператор, краткая проверка нуля)[52]
  • Строчная интерполяция[52]
  • имя оператора[52]
  • Инициализатор словаря[52]
C # 7.0[53][54] (2017)
  • Встроенное объявление переменной
  • Сопоставление с образцом
  • Типы кортежей и литералы кортежей
  • Деконструкция
  • Локальные функции
  • Разделители цифр
  • Двоичные литералы
  • Ref возвращается и местные жители
  • Обобщенные асинхронные возвращаемые типы
  • Конструкторы и финализаторы с телом Expression
  • Геттеры и сеттеры с телом выражений
  • Бросок также можно использовать как выражение
C # 7.1[55] (2017)
  • Асинхронный основной
  • Литеральные выражения по умолчанию
  • Предполагаемые имена элементов кортежа
C # 7.2[56] (2017)
  • Ссылочная семантика с типами значений
  • Не завершающий именованные аргументы
  • Ведущие символы подчеркивания в числовых литералах
  • модификатор частного защищенного доступа
C # 7.3[57] (2018)
  • Доступ к фиксированным полям без закрепления
  • Переназначение локальных переменных ref
  • Использование инициализаторов в массивах stackalloc
  • Использование фиксированных операторов с любым типом, поддерживающим шаблон
  • Использование дополнительных общих ограничений
C # 8.0[58] (2019)
  • структура только для чтения члены
  • Члены интерфейса по умолчанию
  • выключатель выражения
  • Свойство, кортеж и позиционные шаблоны
  • с помощью декларации
  • статический местные функции
  • Одноразовый ref struct
  • Обнуляемые ссылочные типы
  • Индексы и диапазоны
  • Присваивание нулевого слияния
  • Асинхронные потоки
C # 9.0[59] (2020)
  • Записи
  • Только инициализирующие сеттеры
  • Заявления верхнего уровня
  • Улучшения сопоставления с образцом
  • Целые числа собственного размера
  • Указатели функций
  • Подавить выдачу флага localsinit
  • Новые выражения с целевым типом
  • статические анонимные функции
  • Условные выражения целевого типа
  • Ковариантные возвращаемые типы
  • Расширение GetEnumerator Поддержка для для каждого петли
  • Параметры отбрасывания лямбда
  • Атрибуты локальных функций
  • Инициализаторы модуля
  • Новые возможности для частичных методов

Синтаксис

Основной синтаксис языка C # аналогичен синтаксису других языков C-стиля, таких как C, C ++ и Java, в частности:

Отличительные черты

Вот некоторые примечательные особенности C #, которые отличают его от C, C ++ и Java, если они отмечены:

Портативность

По замыслу C # - это язык программирования, который наиболее прямо отражает лежащие в основе Инфраструктура общего языка (CLI).[60] Большинство его внутренних типов соответствуют типам значений, реализованным инфраструктурой CLI. Однако в спецификации языка не указываются требования компилятора к созданию кода: то есть не указывается, что компилятор C # должен нацеливаться на среду CLR или генерировать Общий промежуточный язык (CIL) или создать любой другой конкретный формат. Теоретически компилятор C # может генерировать машинный код как традиционные компиляторы C ++ или Фортран.

Печатать

C # поддерживает строго типизированные объявления неявных переменных с ключевым словом вар, и неявно типизированные массивы с ключевым словом новый[] за которым следует инициализатор коллекции.

C # поддерживает строгий Логический тип данных, bool. Заявления, которые принимают условия, такие как пока и если, требуется выражение типа, реализующего истинный оператор, например логический тип. Хотя C ++ также имеет логический тип, его можно свободно преобразовывать в целые числа и обратно, а также такие выражения, как если) требуется только это а можно преобразовать в bool, что позволяет а быть int или указателем. C # запрещает этот подход «целое число, означающее истину или ложь» на том основании, что программисты вынуждены использовать выражения, которые возвращают точно bool может предотвратить определенные типы ошибок программирования, такие как если (a = b) (использование переуступки = вместо равенства ==).

C # больше тип безопасный чем C ++. Единственный неявные преобразования по умолчанию это те, которые считаются безопасными, например расширение целых чисел. Это принудительно во время компиляции, во время JIT, а в некоторых случаях и во время выполнения. Не происходит неявных преобразований между логическими значениями и целыми числами, а также между членами перечисления и целыми числами (за исключением литерала 0, который может быть неявно преобразован в любой перечислимый тип). Любое определяемое пользователем преобразование должно быть явно помечено как явное или неявное, в отличие от C ++. копировать конструкторы и операторы преобразования, которые по умолчанию неявны.

C # явно поддерживает ковариация и контравариантность в универсальных типах, в отличие от C ++, который имеет некоторую степень поддержки контравариантности просто через семантику возвращаемых типов в виртуальных методах.

Перечисление члены помещаются в свои собственные объем.

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

Локальные переменные не могут тень переменные охватывающего блока, в отличие от C и C ++.

Метапрограммирование

Метапрограммирование через атрибуты C # является частью языка. Многие из этих атрибутов дублируют функциональные возможности директив препроцессора GCC и VisualC ++, зависящих от платформы.

Методы и функции

Метод в C # - это член класса, который может быть вызван как функция (последовательность инструкций), а не просто возможность удержания значения свойства класса. Как и в других синтаксически подобных языках, таких как C ++ и ANSI C, подпись метода - это объявление, содержащее по порядку: любые необязательные ключевые слова доступности (например, частный), явное указание его возвращаемого типа (например, int, или ключевое слово пустота если значение не возвращается), имя метода и, наконец, заключенная в скобки последовательность спецификаций параметров, разделенных запятыми, каждая из которых состоит из типа параметра, его формального имени и, необязательно, значения по умолчанию, которое будет использоваться, если ничего не указано. Определенные виды методов, например, те, которые просто получают или устанавливают свойство класса посредством возвращаемого значения или присваивания, не требуют полной подписи, но в общем случае определение класса включает полное объявление подписи его методов.

Подобно C ++ и в отличие от Java, программисты на C # должны использовать ключевое слово модификатора области видимости. виртуальный чтобы разрешить переопределение методов подклассами.[61]

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

Тип динамичный позволяет выполнять привязку методов во время выполнения, что позволяет вызывать методы, подобные JavaScript, и создавать объекты во время выполнения.

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

C # предлагает Java-подобные синхронизированный вызовы методов через атрибут [MethodImpl (MethodImplOptions.Synchronized)]и поддерживает взаимоисключающие блокировки через ключевое слово замок.

Свойство

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

Начиная с C # 3.0 синтаксический сахар автоматически реализуемых свойств,[62] где аксессор (геттер) и мутатор (сеттер) инкапсулировать операции на одном атрибут класса.

Пространство имен

C # пространство имен обеспечивает тот же уровень изоляции кода, что и Java упаковка или C ++ пространство имен, с правилами и функциями, очень похожими на упаковка. Пространства имен могут быть импортированы с использованием синтаксиса.[63]

Доступ к памяти

В C # указатели адресов памяти могут использоваться только в блоках, специально отмеченных как небезопасно, а программам с небезопасным кодом требуются соответствующие разрешения для запуска. Большая часть доступа к объектам осуществляется через безопасные ссылки на объекты, которые всегда либо указывают на «живой» объект, либо имеют четко определенный ноль ценить; невозможно получить ссылку на «мертвый» объект (объект, который был собран сборщиком мусора) или на случайный блок памяти. Небезопасный указатель может указывать на экземпляр «неуправляемого» типа значения, который не содержит ссылок на объекты, массив, строку или блок выделенной стеком памяти, собранные сборщиком мусора. Код, который не отмечен как небезопасный, может сохранять указатели и управлять ими через System.IntPtr типа, но он не может их разыменовать.

Управляемая память не может быть освобождена явно; вместо этого он автоматически собирает мусор. Сборка мусора решает проблему утечки памяти освобождая программиста от ответственности за освобождение памяти, которая больше не нужна в большинстве случаев. Код, который сохраняет ссылки на объекты дольше, чем требуется, может по-прежнему использовать больше памяти, чем необходимо, однако после освобождения последней ссылки на объект память становится доступной для сборки мусора.

Исключение

Программистам доступен ряд стандартных исключений. Методы в стандартных библиотеках в некоторых случаях регулярно генерируют системные исключения, и диапазон генерируемых исключений обычно документируется. Пользовательские классы исключений могут быть определены для классов, позволяя при необходимости выполнять конкретную обработку для определенных обстоятельств.[64]

Проверенные исключения отсутствуют в C # (в отличие от Java). Это было осознанное решение, основанное на вопросах масштабируемости и версии.[65]

Полиморфизм

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

При реализации нескольких интерфейсов, содержащих метод с тем же именем и принимающих параметры одного типа в одном порядке (то есть с одинаковой подписью), аналогично Ява, C # позволяет использовать как один метод для покрытия всех интерфейсов, так и, при необходимости, определенные методы для каждого интерфейса.

Однако, в отличие от Java, C # поддерживает перегрузка оператора. Только наиболее часто перегружаемые операторы C ++ могут быть перегружены в C #.

Языковой интегрированный запрос (LINQ)

C # может использовать LINQ через .NET Framework. Разработчик может запрашивать различные источники данных при условии IEnumerable интерфейс реализован на объекте. Сюда входят XML-документы, набор данных ADO.NET и базы данных SQL.[66]

Использование LINQ в C # дает такие преимущества, как Intellisense поддержка, мощные возможности фильтрации, безопасность типов с возможностью проверки ошибок компиляции и согласованность для запросов данных из различных источников.[67] Существует несколько различных языковых структур, которые можно использовать с C # и LINQ, и это выражения запросов, лямбда-выражения, анонимные типы, неявно типизированные переменные, методы расширения и инициализаторы объектов.[68]

Функциональное программирование

Хотя в основном это императивный язык, C # 2.0 предлагал ограниченную поддержку функционального программирования посредством первоклассные функции и закрытия в форме анонимных делегатов. В C # 3.0 расширена поддержка функционального программирования за счет введения облегченного синтаксиса для лямбда-выражений, методов расширения (возможность для модулей) и понимание списка синтаксис в форме языка «понимания запросов». В C # 7.0 добавлены функции, обычно встречающиеся в функциональных языках, такие как кортежи и сопоставление с образцом.[69]

Система общих типов

C # имеет единая система типов. Эта унифицированная система типов называется Система общих типов (CTS).[70]

Унифицированная система типов подразумевает, что все типы, включая примитивы, такие как целые числа, являются подклассами Система.Объект учебный класс. Например, каждый тип наследует Нанизывать() метод.

Категории типов данных

CTS разделяет типы данных на две категории:[70]

  1. Типы ссылок
  2. Типы значений

Экземпляры типов значений не имеют ни ссылочной идентичности, ни ссылочной семантики сравнения. Сравнение равенства и неравенства для типов значений сравнивает фактические значения данных в экземплярах, если соответствующие операторы не перегружены. Типы значений являются производными от Система.Тип ценности, всегда имеют значение по умолчанию и всегда могут быть созданы и скопированы. Некоторые другие ограничения типов значений состоят в том, что они не могут быть производными друг от друга (но могут реализовывать интерфейсы) и не могут иметь явного конструктора по умолчанию (без параметров). Примерами типов значений являются все примитивные типы, такие как int (32-битное целое число со знаком), плавать (32-битное число с плавающей запятой IEEE), char (16-битный кодовый блок Unicode), и Система.DateTime (определяет конкретный момент времени с точностью до наносекунды). Другие примеры: перечислить (перечисления) и структура (определяемые пользователем структуры).

Напротив, ссылочные типы имеют понятие ссылочной идентичности, что означает, что каждый экземпляр ссылочного типа по своей сути отличается от любого другого экземпляра, даже если данные в обоих экземплярах одинаковы. Это отражается в сравнениях равенства и неравенства по умолчанию для ссылочных типов, которые проверяют ссылочное, а не структурное равенство, если только соответствующие операторы не перегружены (например, случай для Система.Нить). Некоторые операции не всегда возможны, например создание экземпляра ссылочного типа, копирование существующего экземпляра или выполнение сравнения значений на двух существующих экземплярах. Хотя определенные ссылочные типы могут предоставлять такие услуги, открывая открытый конструктор или реализуя соответствующий интерфейс (например, ICloneable или же IComparable). Примеры ссылочных типов: объект (окончательный базовый класс для всех остальных классов C #), Система.Нить (строка символов Unicode) и Система.Множество (базовый класс для всех массивов C #).

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

Бокс и распаковка

Заниматься боксом - это операция преобразования объекта-значения в значение соответствующего ссылочного типа.[70] Бокс в C # неявный.

Распаковка - это операция преобразования значения ссылочного типа (ранее помещенного в рамку) в значение типа значения.[70] Распаковка в C # требует явного приведение типов. Упакованный объект типа T можно распаковать только в T (или T, допускающий значение NULL).[71]

Пример:

int фу = 42;         // Тип ценности.объект бар = фу;     // foo помещается в бар.int foo2 = (int)бар;  // Распаковка обратно в тип значения.

Библиотеки

Спецификация C # описывает минимальный набор типов и библиотек классов, которые компилятор ожидает иметь в наличии. На практике C # чаще всего используется с некоторыми реализациями Инфраструктура общего языка (CLI), который стандартизирован как ECMA-335 Общая языковая инфраструктура (CLI).

В дополнение к стандартным спецификациям интерфейса командной строки существует множество коммерческих и общественных библиотек, которые строятся на основе библиотек .NET framework для обеспечения дополнительных функций.[72]

C # может вызывать любую библиотеку, включенную в Список библиотек и фреймворков .NET.

Примеры

Привет, мир

Ниже приводится очень простая программа на C #, версия классического "Привет, мир " пример:

с помощью Система;// Версия классической программы "Hello World"учебный класс Программа{    общественный статический пустота Главный(нить[] аргументы)    {        Консоль.WriteLine("Привет, мир!");    }}

Этот код отобразит этот текст в окне консоли:

Привет, мир!

У каждой строки есть цель:

с помощью Система;

Вышеупомянутая строка импортирует все типы в Система пространство имен. Например, Консоль класс, используемый позже в исходном коде, определен в Система пространство имен, то есть его можно использовать без указания полного имени типа (которое включает пространство имен).

// Версия классической программы "Hello World"

Эта строка является комментарием; он описывает и документирует код для программиста (ов).

учебный класс Программа

Выше учебный класс определение для Программа учебный класс. Все, что следует между скобками, описывает этот класс.

{    ...}

Фигурные скобки определяют границы блока кода. В этом первом случае они отмечают начало и конец Программа учебный класс.

общественный статический пустота Главный(нить[] аргументы)

Это объявляет метод члена класса, с которого программа начинает выполнение. Среда выполнения .NET вызывает Главный метод. (Примечание: Главный также может быть вызван из другого места, как и любой другой метод, например из другого метода Программа.) общественный Ключевое слово сообщает компилятору, что метод может быть вызван из любого места любым классом. В статическое ключевое слово делает метод доступным без экземпляра Программа. Каждое консольное приложение Главный точка входа должна быть объявлена статический в противном случае программе потребуется экземпляр Программа, но для любого экземпляра потребуется программа. Чтобы избежать этого неразрешимого круговая зависимость, Обработка компиляторами C # консольные приложения (как указано выше) сообщить об ошибке, если нет статический Главный метод. В пустота ключевое слово заявляет, что Главный не имеет возвращаемое значение.

Консоль.WriteLine("Привет, мир!");

Эта строка записывает вывод. Консоль статический класс в Система пространство имен. Он предоставляет интерфейс для стандартных потоков ввода, вывода и ошибок для консольных приложений. Программа вызывает Консоль метод WriteLine, который отображает на консоли строку с аргументом, строку "Привет, мир!".

GUI

А GUI пример:

с помощью Система;с помощью System.Windows.Forms;учебный класс Программа{    статический пустота Главный()    {        Окно сообщения.Показать("Привет, мир!");        Консоль.WriteLine("Это почти такой же аргумент!");    }}

Этот пример похож на предыдущий, за исключением того, что он генерирует диалоговое окно который содержит сообщение "Hello, World!" вместо записи в консоль.

Изображений

Еще одна полезная библиотека - это System.Drawing библиотека, которая используется для программного рисования изображений. Например:

с помощью Система;с помощью System.Drawing;общественный учебный класс Пример{    общественный статический Изображение img;    общественный статический пустота Главный()    {        img = Изображение.Из файла("Image.png");    }}

Это создаст изображение, идентичное тому, что хранится в «Image.png».

Стандартизация и лицензирование

В августе 2001 года Microsoft Corporation, Hewlett-Packard и Intel Corporation совместно спонсировали предоставление спецификаций для C #, а также Общая языковая инфраструктура (CLI) в организацию по стандартизации Ecma International В декабре 2001 года ECMA выпустила ECMA-334. Спецификация языка C #. C # стал ISO стандарт 2003 г. (ISO / IEC 23270: 2003 - Информационные технологии - Языки программирования - C #). ECMA ранее приняла эквивалентные спецификации как 2-е издание C # в декабре 2002 года.

В июне 2005 года ECMA одобрила редакцию 3 спецификации C # и обновила ECMA-334. Добавления включали частичные классы, анонимные методы, типы, допускающие значение NULL, и дженерики (несколько похоже на C ++ шаблоны ).

В июле 2005 года ECMA представила в ISO / IEC JTC 1 через ускоренный процесс последнего стандарты и соответствующие ТУ. Обычно этот процесс занимает 6–9 месяцев.

Определение языка C # и CLI стандартизированы под ISO и Экма стандарты, которые обеспечивают разумное и недискриминационное лицензирование защита от патентных притязаний.

Microsoft согласилась не подавать в суд на разработчиков с открытым исходным кодом за нарушение патентов в некоммерческих проектах на ту часть платформы, на которую распространяется OSP.[73] Microsoft также согласилась не применять патенты, относящиеся к Novell продукты против платежеспособных клиентов Novell[74] за исключением списка продуктов, в которых явно не упоминается C #, .NET или реализация .NET от Novell (Моно проект ).[75] Однако Novell утверждает, что Mono не нарушает никаких патентов Microsoft.[76] Microsoft также заключила специальное соглашение не применять патентные права, связанные с Плагин для браузера Moonlight, который зависит от Mono, если он получен через Novell.[77]

Реализации

Microsoft возглавляет разработку Открытый исходный код справочные компиляторы C # и набор инструментов, первый компилятор Рослин компилируется в промежуточный язык (IL), второй - RyuJIT,[78] - это JIT-компилятор (точно в срок), который является динамическим, выполняет оптимизацию на лету и компилирует IL в собственный код для внешнего интерфейса процессора.[79] RuyJIT имеет открытый исходный код и написан на C ++.[80] Roslyn полностью написан на управляемый код (C #), и функциональные возможности представлены в виде API. Таким образом, разработчики могут создавать инструменты рефакторинга и диагностики.[4][81] Две ветви официальной реализации - это .NET (закрытые исходные коды, Windows 10 только с .NET 4.6.2) и ядро ​​.NET (открытый исходный код, мультиплатформенность); .NET и ядро ​​.NET объединяются в одну реализацию с открытым исходным кодом .NET 5.0.[82] В .NET 4.6 новый JIT-компилятор заменил прежний.[83][84]

Другие компиляторы C # (некоторые из которых включают реализацию Инфраструктура общего языка и библиотеки классов .NET):

  • В Мононуклеоз Проект предоставляет компилятор C # с открытым исходным кодом, полную реализацию инфраструктуры Common Language Infrastructure с открытым исходным кодом, включая необходимые библиотеки фреймворка, как они указаны в спецификации ECMA, и почти полную реализацию проприетарных библиотек классов Microsoft .NET вплоть до .NET. 3.5. Начиная с Mono 2.6, планов по внедрению WPF; WF планируется к более позднему выпуску; и есть только частичные реализации LINQ to SQL и WCF.[85]
  • В Элементы цепочка инструментов от RemObjects включает RemObjects C #, который компилирует C # для .NET, Java, Cocoa, Android, Windows, Linux и WebAssembly. * DotGNU проект (сейчас прекращенный) также предоставил компилятор C # с открытым исходным кодом, почти полную реализацию инфраструктуры общего языка, включая необходимые библиотеки фреймворка, как они указаны в спецификации ECMA, и подмножество некоторых из оставшихся проприетарных библиотек классов Microsoft .NET. до .NET 2.0 (те, которые не задокументированы и не включены в спецификацию ECMA, но включены в стандартный дистрибутив Microsoft .NET Framework).
  • Xamarin предоставляет инструменты для разработки кроссплатформенных приложений для обычных мобильных и настольных операционных систем с использованием C # в качестве кодовой базы и компиляции в собственный код.

Mono - распространенный выбор для игровых движков из-за его кроссплатформенности.[нужна цитата ]. В Игровой движок Unity использует Mono C # в качестве основного языка сценариев. В Годо игровой движок реализовала дополнительный модуль Mono C # благодаря пожертвованию в размере 24 000 долларов от Microsoft.[86]

Смотрите также

Примечания

  1. ^ для async
  2. ^ По соглашению числовой знак используется для второго символа в обычном тексте; в художественных представлениях иногда истинное острый знак используется: C♯. Тем не менее ECMA 334 стандартных состояния: «Имя C # записывается как ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА C (U + 0043), за которой следует НОМЕРНЫЙ ЗНАК # (U + 0023)».
  3. ^ Документ спецификации Microsoft C # 2.0 содержит только новые функции 2.0. Для более старых функций используйте указанную выше спецификацию 1.2.

Рекомендации

  1. ^ «InfoQ eMag: предварительная версия C # 7».
  2. ^ «Объявление .NET 5.0».
  3. ^ Торгерсен, Мэдс (27 октября 2008 г.). «Новые возможности в C # 4.0». Microsoft. Получено 28 октября, 2008.
  4. ^ а б «Компилятор Roslyn .NET предоставляет языки C # и Visual Basic с API-интерфейсами расширенного анализа кода .: dotnet / roslyn». 13 ноября 2019 г. - через GitHub.
  5. ^ «CoreCLR - это среда выполнения для .NET Core. Она включает сборщик мусора, JIT-компилятор, примитивные типы данных и низкоуровневые классы: dotnet / coreclr». 13 ноября 2019 г. - через GitHub.
  6. ^ а б Науглер, Дэвид (май 2007 г.). «C # 2.0 для программистов на C ++ и Java: семинар-практикум». Журнал компьютерных наук в колледжах. 22 (5). Хотя на C # сильно повлияла Java, на него также сильно повлиял C ++, и его лучше всего рассматривать как потомка как C ++, так и Java.
  7. ^ Гамильтон, Наоми (1 октября 2008 г.). «Азбука языков программирования: C #». Computerworld. Получено 12 февраля, 2010. Мы все стоим здесь на плечах гигантов, и каждый язык строится на том, что было до него, поэтому мы многим обязаны C, C ++, Java, Delphi и всем остальным вещам, которые были до нас. (Андерс Хейлсберг )
  8. ^ "Спецификация часовни (Благодарности)" (PDF). Cray Inc. 1 октября 2015 г.. Получено 14 января, 2016.
  9. ^ "Rich Hickey Q&A от Майкла Фогуса". Архивировано из оригинал 11 января 2017 г.. Получено 11 января, 2017.
  10. ^ Бореншвейг, Ари. "Кристалл 0.18.0 выпущен!". Он во многом вдохновлен Ruby и другими языками (такими как C #, Go и Python).
  11. ^ «Веб-языки и виртуальные машины: быстрый код всегда в моде. (V8, Dart) - Google I / O 2013». Получено 22 декабря, 2013.
  12. ^ В Java 5.0 добавлено несколько новых языковых функций ( улучшен для цикла, автобокс, varargs и аннотации ), после того, как они были представлены на похожем (и конкурирующем) языке C # [1] [2]
  13. ^ Корнелиус, Барри (1 декабря 2005 г.). «Java 5 догоняет C #». Оксфордский университет Вычислительные услуги. Получено 18 июня, 2014. На мой взгляд, эти радикальные изменения в языке Java вызвал именно C #. (Барри Корнелиус )
  14. ^ Ring Team (5 декабря 2017 г.). «Кольцевой язык программирования и другие языки». ring-lang.net. кольцевой язык.
  15. ^ Латтнер, Крис (3 июня 2014 г.). "Домашняя страница Криса Латтнера". Крис Латтнер. Получено 12 мая, 2020. Язык Swift является продуктом неустанных усилий команды языковых экспертов, гуру документации, ниндзя по оптимизации компиляторов и невероятно важной внутренней группы, которая предоставила отзывы, чтобы помочь усовершенствовать и протестировать идеи. Конечно, он также очень выиграл от опыта, с трудом завоеванного многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C #, CLU и слишком многих других, чтобы перечислить.
  16. ^ а б c Спецификация языка C # (PDF) (4-е изд.). Ecma International. Июнь 2006 г.. Получено 26 января, 2012.
  17. ^ «Примечания к выпуску предварительной версии Visual Studio 2019». docs.microsoft.com. Получено 15 октября, 2020.
  18. ^ «Загрузить .NET 5.0 (Linux, macOS и Windows)». Microsoft. Получено 15 октября, 2020.
  19. ^ Зандер, Джейсон (22 ноября 2007 г.). «Пара исторических фактов». Получено 23 февраля, 2009.
  20. ^ Гатри, Скотт (28 ноября 2006 г.). «На каком языке изначально был написан ASP.Net?». Архивировано из оригинал 24 июня 2016 г.. Получено 21 февраля, 2008.
  21. ^ Гамильтон, Наоми (1 октября 2008 г.). «Азбука языков программирования: C #». Computerworld. Получено 1 октября, 2008.
  22. ^ "Подробности". nilsnaegele.com. Получено 7 апреля, 2019.
  23. ^ Уайли Вонг (2002). «Почему Microsoft C # - нет». CNET: CBS Interactive. Получено 28 мая, 2014.
  24. ^ Билл Джой (7 февраля 2002 г.). «Слепое пятно Microsoft». cnet.com. Получено 12 января, 2010.
  25. ^ Клаус Крефт и Анжелика Лангер (2003). «После Java и C # - что дальше?». Получено 18 июня, 2013.
  26. ^ Клаус Крефт и Анжелика Лангер (3 июля 2003 г.). «После Java и C # - что дальше?». artima.com. Получено 12 января, 2010.
  27. ^ Осборн, Джон (1 августа 2000 г.). «Deep Inside C #: интервью с главным архитектором Microsoft Андерсом Хейлсбергом». O'Reilly Media. Получено 14 ноября, 2009. Цитировать журнал требует | журнал = (помощь)
  28. ^ "Generics (Руководство по программированию на C #)". Microsoft. Получено Двадцать первое марта, 2011.
  29. ^ Дон Бокс и Андерс Хейлсберг (февраль 2007 г.). «LINQ: запрос, интегрированный с языком .NET». Microsoft. Получено Двадцать первое марта, 2011.
  30. ^ Мерсер, Ян (15 апреля 2010 г.). «Почему функциональное программирование и LINQ часто лучше процедурного кода». abodit.com. Получено Двадцать первое марта, 2011.
  31. ^ "Энди на пенсии". Блог Дэна Фернандеса. Blogs.msdn.com. 29 января 2004 г.. Получено 4 октября, 2012.
  32. ^ «Технические комитеты - JTC 1 / SC 22 - Языки программирования, их среды и интерфейсы системного программного обеспечения». ISO. Получено 4 октября, 2012.
  33. ^ «ISO / IEC 23270: 2003 - Информационные технологии - Спецификация языка C #». Iso.org. 23 августа 2006 г. Архивировано с оригинал 8 мая 2012 г.. Получено 4 октября, 2012.
  34. ^ «ISO / IEC 23270: 2006 - Информационные технологии - Языки программирования - C #». Iso.org. 26 января 2012 г.. Получено 4 октября, 2012.
  35. ^ «SO / IEC 23270: 2018 Информационные технологии - Языки программирования - C #». ISO. Получено 26 ноября, 2020.
  36. ^ Мариани, Рико. «Моя история Visual Studio (часть 1) - лакомые кусочки производительности Рико Мариани». Лакомые кусочки выступления Рико Мариани.
  37. ^ Ковач, Джеймс (7 сентября 2007 г.). "Урок истории C # /. NET". Получено 18 июня, 2009.
  38. ^ Хейлсберг, Андерс (1 октября 2008 г.). «Азбука языков программирования: C #». Computerworld.
  39. ^ «Microsoft C # FAQ». Microsoft. Архивировано из оригинал 14 февраля 2006 г.. Получено 25 марта, 2008.
  40. ^ "F # FAQ". Microsoft Research. Архивировано из оригинал 18 февраля 2009 г.. Получено 18 июня, 2009.
  41. ^ Саймон, Рафаэль; Стапф, Эммануэль; Мейер, Бертран (июнь 2002 г.). «Полный Eiffel на .NET Framework». Microsoft. Получено 18 июня, 2009.
  42. ^ а б «Использование C # 3.0 из .NET 2.0». Danielmoth.com. 13 мая 2007 г.. Получено 4 октября, 2012.
  43. ^ "Visual Studio 2017 15.3 Release Notes". docs.microsoft.com.
  44. ^ а б «Примечания к выпуску Visual Studio 2017 15.9». docs.microsoft.com.
  45. ^ а б "Visual Studio 2019 16.8 Release Notes". docs.microsoft.com.
  46. ^ а б c d е ж грамм час я j k "What's new in the C# 2.0 Language and Compiler". Сеть разработчиков Microsoft. Microsoft. Получено 11 июня, 2014.
  47. ^ а б c d е ж грамм час Hejlsberg, Anders; Torgersen, Mads. "Overview of C# 3.0". Сеть разработчиков Microsoft. Microsoft. Получено 11 июня, 2014.
  48. ^ Ghosh, Wriju. "C# 3.0 : Partial * Garbage Collection Methods". Блоги MSDN. Microsoft. Получено 11 июня, 2014.
  49. ^ а б c d Burrows, Chris. "C# 4.0 - New C# Features in the .NET Framework 4". Сеть разработчиков Microsoft. Microsoft. Получено 11 июня, 2014.
  50. ^ Hejlsberg, Anders. "Future directions for C# and Visual Basic". C# lead architect. Microsoft. Получено 21 сентября, 2011.
  51. ^ а б "An Introduction to New Features in C# 5.0". Блоги MSDN. Microsoft. Получено 11 июня, 2014.
  52. ^ а б c d е ж грамм час я j "Language feature implementation status". github. Microsoft. Получено 13 февраля, 2015.
  53. ^ "What's new in C# 7". Документы Microsoft. 21 декабря 2016 г.
  54. ^ "New Features in C# 7.0". Блог .NET. Получено 9 июня, 2017.
  55. ^ "What's new in C# 7.1". Документы Microsoft. Получено 9 октября, 2017.
  56. ^ "What's new in C# 7.2". Документы Microsoft. Получено 26 ноября, 2017.
  57. ^ "What's new in C# 7.3". Документы Microsoft. Получено 23 июня, 2018.
  58. ^ "What's new in C# 8.0". Документы Microsoft.
  59. ^ BillWagner. "What's new in C# 9.0 - C# Guide". docs.microsoft.com. Получено 15 октября, 2020.
  60. ^ Visual Studio 2010 and .NET 4 Six-in-One. Wrox Press. 2010 г. ISBN  978-0470499481.
  61. ^ "virtual (C# Reference)". docs.microsoft.com.
  62. ^ "Auto-Implemented Properties (C# Programming Guide)". Получено 12 сентября, 2020.
  63. ^ "using directive - C# Reference". Документы Microsoft. Получено 14 апреля, 2019.
  64. ^ "How to create user-defined exceptions". Получено 12 сентября, 2020.
  65. ^ Веннерс, Билл; Eckel, Bruce (August 18, 2003). "The Trouble with Checked Exceptions". Получено 30 марта, 2010.
  66. ^ Zhang, Xue Dong; Teng, Zi Mu; Zhao, Dong Wang (September 2014). "Research of the Database Access Technology Under.NET Framework". Applied Mechanics and Materials. 644-650: 3077–3080. Дои:10.4028/www.scientific.net/AMM.644-650.3077. S2CID  62201466. ProQuest  1565579768.
  67. ^ Otey, Michael (February 2006). "LINQ to the Future". SQL Server Magazine. Vol. 8 нет. 2. pp. 17–21. ProQuest  214859896.
  68. ^ Sheldon, William (November 2010). "New Features in LINQ". SQL Server Magazine. Vol. 12 нет. 11. pp. 37–40. ProQuest  770609095.
  69. ^ "What's New in C# 7.0". Документы Microsoft. Получено 14 апреля, 2019.
  70. ^ а б c d Archer, Tom (2001). "Part 2, Chapter 4: The Type System". Inside C#. Редмонд, Вашингтон: Microsoft Press. ISBN  0-7356-1288-9.
  71. ^ Lippert, Eric (March 19, 2009). "Representation and Identity". Fabulous Adventures In Coding. Blogs.msdn.com. Получено 4 октября, 2012.
  72. ^ "Framework Libraries". docs.microsoft.com.
  73. ^ "Patent Pledge for Open Source Developers".
  74. ^ "Patent Cooperation Agreement - Microsoft & Novell Interoperability Collaboration". Microsoft. 2 ноября 2006 г. Архивировано с оригинал 17 мая 2009 г.. Получено 5 июля, 2009. Microsoft, on behalf of itself and its Subsidiaries (collectively "Microsoft"), hereby covenants not to sue Novell's Customers and Novell's Subsidiaries' Customers for infringement under Covered Patents of Microsoft on account of such a Customer's use of specific copies of a Covered Product as distributed by Novell or its Subsidiaries (collectively "Novell") for which Novell has received Revenue (directly or indirectly) for such specific copies; provided the foregoing covenant is limited to use by such Customer (i) of such specific copies that are authorized by Novell in consideration for such Revenue, and (ii) within the scope authorized by Novell in consideration for such Revenue.
  75. ^ "Определения". Microsoft. 2 ноября 2006 г.. Получено 5 июля, 2009.
  76. ^ Steinman, Justin (November 7, 2006). "Novell Answers Questions from the Community". Получено 5 июля, 2009. We maintain that Mono does not infringe any Microsoft patents.
  77. ^ "Covenant to Downstream Recipients of Moonlight - Microsoft & Novell Interoperability Collaboration". Microsoft. 28 сентября 2007 г. Архивировано с оригинал 23 сентября 2010 г.. Получено 8 марта, 2008. "Downstream Recipient" means an entity or individual that uses for its intended purpose a Moonlight Implementation obtained directly from Novell or through an Intermediate Recipient... Microsoft reserves the right to update (including discontinue) the foregoing covenant... "Moonlight Implementation" means only those specific portions of Moonlight 1.0 or Moonlight 1.1 that run only as a plug-in to a browser on a Personal Computer and are not licensed under GPLv3 or a Similar License.
  78. ^ https://devblogs.microsoft.com/dotnet/the-ryujit-transition-is-complete/
  79. ^ https://docs.microsoft.com/en-us/dotnet/standard/managed-execution-process
  80. ^ https://github.com/dotnet/coreclr/tree/master/src/jit
  81. ^ "C# Guide". docs.microsoft.com.
  82. ^ https://dotnet.microsoft.com/download/dotnet/5.0
  83. ^ https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/mitigation-new-64-bit-jit-compiler
  84. ^ https://devblogs.microsoft.com/dotnet/the-ryujit-transition-is-complete/
  85. ^ "Compatibility - Mono". Mono-project.com. 19 декабря 2011 г.. Получено 4 октября, 2012.
  86. ^ Etcheverry, Ignacio (October 21, 2017). "Introducing C# in Godot". Godot Engine. В архиве с оригинала 26 октября 2018 г.. Получено 26 октября, 2018.

дальнейшее чтение

внешняя ссылка