Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

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

C # был разработан около 2000 года Microsoft в рамках своей .NET инициативы , а затем утвержден в качестве международного стандарта по Ecma (ECMA-334) в 2002 и ISO (ISO / IEC 23270) , в 2003 году был разработан Хейлсберг , и его Команда разработчиков в настоящее время возглавляется Мадсом Торгерсеном, который является одним из языков программирования, созданных для Common Language Infrastructure (CLI). Самая последняя версия - 9.0, выпущенная в 2020 году в .NET 5.0 и включенная в Visual Studio 2019 версии 16.8. [16] [17]

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

Цели дизайна [ править ]

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

  • Этот язык задуман как простой, современный, объектно-ориентированный язык программирования общего назначения .
  • Язык и его реализации должны обеспечивать поддержку принципов разработки программного обеспечения, таких как строгая проверка типов, проверка границ массива , обнаружение попыток использования неинициализированных переменных и автоматическая сборка мусора . Важны надежность, надежность и продуктивность программного обеспечения.
  • Язык предназначен для использования при разработке программных компонентов, подходящих для развертывания в распределенных средах.
  • Переносимость очень важна для исходного кода и программистов , особенно тех, кто уже знаком с C и C ++ .
  • Поддержка интернационализации очень важна.
  • C # предназначен для написания приложений как для размещенных, так и для встроенных систем , от очень больших, использующих сложные операционные системы , до очень маленьких, имеющих специальные функции.
  • Хотя приложения C # должны быть экономичными в отношении требований к памяти и вычислительной мощности , язык не предназначался для прямой конкуренции по производительности и размеру с C или языком ассемблера.

История [ править ]

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

Хейлсберг - главный разработчик C # и ведущий архитектор в Microsoft, ранее участвовал в разработке Turbo Pascal , Embarcadero Delphi (ранее CodeGear Delphi, Inprise Delphi и Borland Delphi) и Visual J ++ . В интервью и технических статьях он заявлял, что недостатки [21] в большинстве основных языков программирования (например, C ++ , Java , Delphi и Smalltalk ) привели к основам Common Language Runtime (CLR), что, в свою очередь, привело к разработке сам язык C #.

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

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

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

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

Имя [ редактировать ]

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

Музыкальная нота до-диез

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

Из-за технических ограничений отображения (стандартные шрифты, браузеры и т. Д.) И того факта, что острый символ ( U + 266F MUSIC SHARP SIGN (HTML  ♯ · ♯ )) отсутствует на большинстве раскладок клавиатуры , числовой знак ( U + 0023 # ЗНАК ЗНАКА (HTML  · )) был выбран для приближения острого символа в письменном названии языка программирования. [38] Это соглашение отражено в спецификации языка C # ECMA-334. [15] #  #

Суффикс «острый» использовался рядом других языков .NET, которые являются вариантами существующих языков, включая J # (язык .NET, также разработанный Microsoft, который является производным от Java 1.1), A # (от Ada ) и функциональный язык программирования F # . [39] Первоначальная реализация Eiffel для .NET называлась Eiffel #, [40] это название было отменено, так как теперь поддерживается полный язык Eiffel . Суффикс также использовался для библиотек , таких как Gtk # ( оболочка .NET для GTK + и других GNOMEбиблиотеки) и Какао # (оболочка для Какао ).

Версии [ править ]

Синтаксис [ править ]

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

  • Точка с запятой используется для обозначения конца инструкции.
  • Фигурные скобки используются для группировки операторов. Операторы обычно группируются в методы (функции), методы в классы и классы в пространства имен .
  • Переменные назначаются с использованием знака равенства , но сравниваются с использованием двух последовательных знаков равенства .
  • Квадратные скобки используются с массивами как для их объявления, так и для получения значения по заданному индексу в одном из них.

Отличительные особенности [ править ]

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

Переносимость [ править ]

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

Печатать [ править ]

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

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

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

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

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

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

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

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

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

Методы и функции [ править ]

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

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

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

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

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

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

Свойство [ править ]

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

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

Пространство имен [ править ]

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

Доступ к памяти [ править ]

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

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

Исключение [ править ]

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

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

Полиморфизм [ править ]

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

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

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

Language Integrated Query (LINQ) [ править ]

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

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

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

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

Система общих типов [ править ]

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

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

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

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

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

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

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

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

Бокс и распаковка [ править ]

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

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

Пример:

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

Библиотеки [ править ]

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

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

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

Примеры [ править ]

Привет, мир [ править ]

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

используя  Систему ;// Версия классического программного класса  "Hello World" Program {  public  static  void  Main ( string []  args )  {  Console . WriteLine ( «Привет, мир!» );  } }

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

Привет мир!

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

используя  Систему ;

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

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

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

 программа класса

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

{  ... }

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

public  static  void  Main ( строка []  аргументы )

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

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

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

GUI [ править ]

Пример графического интерфейса :

используя  Систему ; using  System.Windows.Forms ;class  Program {  static  void  Main ()  {  MessageBox . Show ( «Привет, мир!» );  Консоль . WriteLine ( «Это почти тот же аргумент!» );  } }

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

Изображения [ редактировать ]

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

используя  Систему ; с помощью  System.Drawing ;публичный  класс  Example {  public  static  Image  img ; public  static  void  Main ()  {  img  =  Image . FromFile ( "Изображение.png" );  } }

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

Стандартизация и лицензирование [ править ]

В августе 2001 года Microsoft Corporation, Hewlett-Packard и Intel Corporation совместно спонсировали предоставление спецификаций для C #, а также Common Language Infrastructure (CLI) организации по стандартизации Ecma International . В декабре 2001 года ECMA выпустила спецификацию языка C # ECMA-334 . 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 # и интерфейс командной строки стандартизированы в соответствии со стандартами ISO и Ecma, которые обеспечивают разумную и недискриминационную лицензионную защиту от патентных притязаний.

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

Реализации [ править ]

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

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

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

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

См. Также [ править ]

Заметки [ править ]

  1. ^ для асинхронного
  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. ^ Torgersen, Мэдс (27 октября 2008). «Новые возможности C # 4.0» . Microsoft . Проверено 28 октября 2008 года .
  4. ^ a b «Компилятор Roslyn .NET предоставляет языки C # и Visual Basic с богатыми API-интерфейсами для анализа кода .: dotnet / roslyn» . 13 ноября 2019 г. - через GitHub.
  5. ^ «CoreCLR - это среда выполнения для .NET Core. Она включает сборщик мусора, JIT-компилятор, примитивные типы данных и низкоуровневые классы .: dotnet / coreclr» . 13 ноября 2019 г. - через GitHub.
  6. ^ a b Науглер, Дэвид (май 2007 г.). «C # 2.0 для программистов на C ++ и Java: семинар-практикум». Журнал компьютерных наук в колледжах . 22 (5). Хотя на C # сильно повлияла Java, на него также сильно повлиял C ++, и его лучше всего рассматривать как потомка как C ++, так и Java.
  7. Гамильтон, Наоми (1 октября 2008 г.). «Азия языков программирования: C #» . Компьютерный мир . Проверено 12 февраля 2010 года . Мы все стоим здесь на плечах гигантов, и каждый язык строится на том, что было до него, поэтому мы многим обязаны C, C ++, Java, Delphi и всем остальным, что было до нас. ( Андерс Хейлсберг )
  8. ^ "Спецификация часовни (Благодарности)" (PDF) . Cray Inc. 1 октября 2015 . Проверено 14 января 2016 года .
  9. ^ "Rich Hickey Q&A Майклом Фогусом" . Архивировано из оригинала на 11 января 2017 года . Проверено 11 января 2017 года .
  10. ^ Borenszweig, Ари. "Кристалл 0.18.0 выпущен!" . Он во многом вдохновлен Ruby и другими языками (такими как C #, Go и Python).
  11. ^ «Веб-языки и виртуальные машины: быстрый код всегда в моде. (V8, Dart) - Google I / O 2013» . Проверено 22 декабря 2013 года .
  12. ^ В Java 5.0 добавлено несколько новых языковых функций ( улучшенный цикл for , автобокс , varargs и аннотации ) после того, как они были представлены в аналогичном (и конкурирующем) языке C # [1] [2]
  13. Корнелиус, Барри (1 декабря 2005 г.). «Java 5 догоняет C #» . Оксфордский университет вычислительных услуг . Проверено 18 июня 2014 года . На мой взгляд, эти радикальные изменения в языке Java вызвал именно C #. ( Барри Корнелиус )
  14. ^ Lattner, Крис (3 июня 2014). "Домашняя страница Криса Латтнера" . Крис Латтнер . Проверено 12 мая 2020 года . Язык Swift является продуктом неустанных усилий команды языковых экспертов, гуру документации, ниндзя по оптимизации компиляторов и невероятно важной внутренней группы, которая предоставила отзывы, чтобы помочь усовершенствовать и опробовать идеи в боевых условиях. Конечно, он также очень выиграл от опыта, с трудом завоеванного многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C #, CLU и слишком многих других, чтобы перечислить.
  15. ^ a b c Спецификация языка C # (PDF) (4-е изд.). Ecma International . Июнь 2006 . Проверено 26 января 2012 года .
  16. ^ «Примечания к выпуску предварительной версии Visual Studio 2019» . docs.microsoft.com . Проверено 15 октября, 2020 .
  17. ^ «Загрузить .NET 5.0 (Linux, macOS и Windows)» . Microsoft . Проверено 15 октября, 2020 .
  18. Зандер, Джейсон (22 ноября 2007 г.). «Пара исторических фактов» . Проверено 23 февраля 2009 года .
  19. Гатри, Скотт (28 ноября 2006 г.). «На каком языке изначально был написан ASP.Net?» . Архивировано из оригинального 24 июня 2016 года . Проверено 21 февраля 2008 года .
  20. Гамильтон, Наоми (1 октября 2008 г.). «Азия языков программирования: C #» . Компьютерный мир . Проверено 1 октября 2008 года .
  21. ^ "Подробности" . nilsnaegele.com . Проверено 7 апреля 2019 года .
  22. ^ Уайли Wong (2002). «Почему Microsoft C # нет» . CNET: CBS Interactive . Проверено 28 мая 2014 года .
  23. Билл Джой (7 февраля 2002 г.). «Слепое пятно Microsoft» . cnet.com . Проверено 12 января 2010 года .
  24. Клаус Крефт и Анжелика Лангер (2003). «После Java и C # - что дальше?» . Проверено 18 июня 2013 года .
  25. Клаус Крефт и Анжелика Лангер (3 июля 2003 г.). «После Java и C # - что дальше?» . artima.com . Проверено 12 января 2010 года .
  26. Осборн, Джон (1 августа 2000 г.). «Deep Inside C #: интервью с главным архитектором Microsoft Андерсом Хейлсбергом» . O'Reilly Media . Проверено 14 ноября 2009 года . Цитировать журнал требует |journal=( помощь )
  27. ^ "Generics (Руководство по программированию на C #)" . Microsoft . Проверено 21 марта 2011 года .
  28. ^ Дон Бокс и Хейлсберг (февраль 2007). «LINQ: запрос, интегрированный с языком .NET» . Microsoft . Проверено 21 марта 2011 года .
  29. Мерсер, Ян (15 апреля 2010 г.). «Почему функциональное программирование и LINQ часто лучше процедурного кода» . abodit.com . Проверено 21 марта 2011 года .
  30. ^ "Энди уходит в отставку" . Блог Дэна Фернандеса . Blogs.msdn.com. 29 января 2004 . Проверено 4 октября 2012 года .
  31. ^ «Технические комитеты - JTC 1 / SC 22 - Языки программирования, их среды и интерфейсы системного программного обеспечения» . ISO . Проверено 4 октября 2012 года .
  32. ^ «ISO / IEC 23270: 2003 - Информационные технологии - Спецификация языка C #» . Iso.org. 23 августа 2006 года Архивировано из оригинала 8 мая 2012 года . Проверено 4 октября 2012 года .
  33. ^ «ISO / IEC 23270: 2006 - Информационные технологии - Языки программирования - C #» . Iso.org. 26 января 2012 . Проверено 4 октября 2012 года .
  34. ^ «SO / IEC 23270: 2018 Информационные технологии - Языки программирования - C #» . ISO . Проверено 26 ноября 2020 года .
  35. ^ Мариани, Рико. «Моя история Visual Studio (часть 1) - лакомые кусочки производительности Рико Мариани» . Лакомые кусочки выступления Рико Мариани .
  36. Ковач, Джеймс (7 сентября 2007 г.). "Урок истории C # /. NET" . Проверено 18 июня 2009 года .
  37. ^ Хейлсберг, Андерс (1 октября 2008). «Азия языков программирования: C #» . Компьютерный мир .
  38. ^ "Microsoft C # FAQ" . Microsoft . Архивировано из оригинального 14 февраля 2006 года . Проверено 25 марта 2008 года .
  39. ^ "F # FAQ" . Microsoft Research. Архивировано из оригинального 18 февраля 2009 года . Проверено 18 июня 2009 года .
  40. ^ Саймон, Рафаэль; Стапф, Эммануэль; Мейер, Бертран (июнь 2002 г.). «Полный Eiffel на .NET Framework» . Microsoft . Проверено 18 июня 2009 года .
  41. ^ «Что нового в языке и компиляторе C # 2.0» . Сеть разработчиков Microsoft (archive.org) . Microsoft . Проверено 11 июня 2014 года .
  42. ^ Хейлсберг, Андерс; Торгерсен, Мадс. «Обзор C # 3.0» . Сеть разработчиков Microsoft . Microsoft . Проверено 11 июня 2014 года .
  43. ^ a b «Использование C # 3.0 из .NET 2.0» . Danielmoth.com. 13 мая 2007 . Проверено 4 октября 2012 года .
  44. ^ Хейлсберг, Андерс. «Будущие направления для C # и Visual Basic» . Ведущий архитектор C # . Microsoft . Проверено 21 сентября 2011 года .
  45. ^ «Введение в новые возможности C # 5.0» . Блоги MSDN . Microsoft . Проверено 11 июня 2014 года .
  46. ^ «Статус реализации языковой функции» . github . Microsoft . Проверено 13 февраля 2015 года .
  47. ^ «Что нового в C # 7» . Документы Microsoft . 21 декабря 2016 г.
  48. ^ «Новые возможности в C # 7.0» . Блог .NET . Проверено 9 июня 2017 года .
  49. ^ «Что нового в C # 7.1» . Документы Microsoft . Проверено 9 октября 2017 года .
  50. ^ «Заметки о выпуске Visual Studio 2017 15.3» . docs.microsoft.com .
  51. ^ «Что нового в C # 7.2» . Документы Microsoft . Проверено 26 ноября 2017 года .
  52. ^ a b «Примечания к выпуску Visual Studio 2017 15.9» . docs.microsoft.com .
  53. ^ «Что нового в C # 7.3» . Документы Microsoft . Проверено 23 июня 2018 года .
  54. ^ «Что нового в C # 8.0» . Документы Microsoft .
  55. ^ a b «Примечания к выпуску Visual Studio 2019 16.8» . docs.microsoft.com .
  56. ^ Билл Вагнер. «Что нового в C # 9.0 - Руководство по C #» . docs.microsoft.com . Проверено 15 октября, 2020 .
  57. ^ Visual Studio 2010 и .NET 4 Six-in-One . Wrox Press. 2010. ISBN 978-0470499481.
  58. ^ "виртуальный (Справочник по C #)" . docs.microsoft.com .
  59. ^ «Автореализуемые свойства (Руководство по программированию на C #)» . Проверено 12 сентября 2020 года .
  60. ^ "Директива using - Справочник по C #" . Документы Microsoft . Проверено 14 апреля 2019 года .
  61. ^ «Как создавать пользовательские исключения» . Проверено 12 сентября 2020 года .
  62. ^ Веннерс, Билл; Экель, Брюс (18 августа 2003 г.). «Проблема с проверенными исключениями» . Проверено 30 марта 2010 года .
  63. ^ Чжан, Сюэ Донг; Teng, Zi Mu; Чжао, Донг Ван (сентябрь 2014 г.). «Исследование технологии доступа к базам данных в .NET Framework». Прикладная механика и материалы . 644–650: 3077–3080. DOI : 10,4028 / www.scientific.net / AMM.644-650.3077 . S2CID 62201466 . ProQuest 1565579768 .  
  64. ^ Оти, Майкл (февраль 2006). «LINQ to the Future». Журнал SQL Server . Vol. 8 нет. 2. С. 17–21. ProQuest 214859896 . 
  65. ^ Шелдон, Уильям (ноябрь 2010 г.). «Новые возможности в LINQ». Журнал SQL Server . Vol. 12 ч. 11. С. 37–40. ProQuest 770609095 . 
  66. ^ «Что нового в C # 7.0» . Документы Microsoft . Проверено 14 апреля 2019 года .
  67. ^ a b c d Арчер, Том (2001). «Часть 2, Глава 4: Система типов». Внутри C # . Редмонд, Вашингтон: Microsoft Press. ISBN 0-7356-1288-9.
  68. ^ Lippert, Эрик (19 марта 2009). «Представление и идентичность» . Сказочные приключения в кодировании . Blogs.msdn.com . Проверено 4 октября 2012 года .
  69. ^ «Библиотеки фреймворков» . docs.microsoft.com .
  70. ^ «Патентное обязательство для разработчиков с открытым исходным кодом» .
  71. ^ «Соглашение о патентном сотрудничестве - совместная работа Microsoft и Novell» . Microsoft . 2 ноября 2006 года архивация с оригинала на 17 мая 2009 года . Проверено 5 июля 2009 года .Microsoft от имени себя и своих Дочерних компаний (совместно именуемых «Microsoft») настоящим соглашается не предъявлять иски клиентам Novell и клиентам дочерних компаний Novell за нарушение Защищенных патентов Microsoft в связи с использованием таким Клиентом определенных копий Защищенного продукта, как распространяются Novell или ее дочерними компаниями (совместно именуемые «Novell»), от которых Novell получила доход (прямо или косвенно) за такие конкретные копии; при условии, что вышеупомянутое соглашение ограничивается использованием таким Заказчиком (i) таких конкретных копий, которые разрешены Novell для получения такого дохода, и (ii) в пределах, разрешенных Novell в отношении такого дохода.
  72. ^ «Определения» . Microsoft . 2 ноября 2006 . Проверено 5 июля 2009 года .
  73. Перейти ↑ Steinman, Justin (7 ноября 2006 г.). «Novell отвечает на вопросы сообщества» . Проверено 5 июля 2009 года . Мы утверждаем, что Mono не нарушает какие-либо патенты Microsoft.
  74. ^ «Соглашение с нижестоящими получателями Moonlight - совместная работа Microsoft и Novell» . Microsoft . 28 сентября, 2007. Архивировано из оригинального 23 сентября 2010 года . Проверено 8 марта 2008 года . «Последующий получатель» означает юридическое или физическое лицо, которое использует по своему прямому назначению реализацию Moonlight, полученную непосредственно от Novell или через промежуточного получателя ... Microsoft оставляет за собой право обновить (в том числе прекратить) вышеуказанное соглашение ... «Реализация Moonlight» означает только те конкретные части Moonlight 1.0 или Moonlight 1.1, которые работают только как подключаемый модуль к браузеру на Персональном компьютере и не лицензируются под GPLv3 или аналогичной лицензией.
  75. ^ https://devblogs.microsoft.com/dotnet/the-ryujit-transition-is-complete/
  76. ^ https://docs.microsoft.com/en-us/dotnet/standard/managed-execution-process
  77. ^ https://github.com/dotnet/coreclr/tree/master/src/jit
  78. ^ "Руководство по C #" . docs.microsoft.com .
  79. ^ https://dotnet.microsoft.com/download/dotnet/5.0
  80. ^ https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/mitigation-new-64-bit-jit-compiler
  81. ^ https://devblogs.microsoft.com/dotnet/the-ryujit-transition-is-complete/
  82. ^ "Совместимость - Моно" . Mono-project.com. 19 декабря 2011 . Проверено 4 октября 2012 года .
  83. ^ Etcheverry, Ignacio (21 октября 2017). «Знакомство с C # в Годо» . Годо Двигатель . Архивировано 26 октября 2018 года . Проверено 26 октября 2018 года .

Дальнейшее чтение [ править ]

  • Дрейтон, Питер; Альбахари, Бен; Ньюард, Тед (2002). Карманный справочник по языку C # . О'Рейли. ISBN 0-596-00429-X.
  • Петцольд, Чарльз (2002). Программирование Microsoft Windows с помощью C # . Microsoft Press. ISBN 0-7356-1370-2.

Внешние ссылки [ править ]

  • Спецификация языка C #
  • Руководство по программированию на C #
  • Спецификация языка ISO C #
  • Исходный код платформы компилятора C # (Roslyn)