Си Шарп (язык программирования)
C# ( / ˌ s iː ˈ ʃ ɑːr p / см. SHARP ) [б] — это общего назначения, высокого уровня язык программирования поддерживающий множество парадигм . C# включает статическую типизацию, [16] : 4 строгая типизация , лексическая область видимости , императивный , декларативный , функциональный , общий , [16] : 22 объектно-ориентированного ( классового ) и компонентно-ориентированного программирования. дисциплины [17]
Основными изобретателями языка программирования C# были Андерс Хейлсберг , Скотт Вильтамут и Питер Голд из Microsoft . [17] Впервые он был широко распространен в июле 2000 года. [17] и позже был одобрен в качестве международного стандарта Ecma . (ECMA-334) в 2002 году и ISO / IEC (ISO/IEC 23270 и 20619) [с] ) в 2003 году. Microsoft представила C# вместе с .NET Framework и Visual Studio , оба из которых имели закрытый исходный код . В то время у Microsoft не было продуктов с открытым исходным кодом. Четыре года спустя, в 2004 году, с открытым исходным кодом стартовал бесплатный проект под названием Mono , предоставляющий кроссплатформенный компилятор и среду выполнения для языка программирования C#. Десять лет спустя Microsoft выпустила Visual Studio Code (редактор кода), Roslyn (компилятор) и унифицированную платформу .NET (программная среда), все из которых поддерживают C#, являются бесплатными, с открытым исходным кодом и кроссплатформенными. Mono также присоединилась к Microsoft, но не была объединена с .NET.
По состоянию на ноябрь 2023 г. [update] Самая последняя стабильная версия языка — C# 12.0, выпущенная в 2023 году в .NET 8.0. [18] [19]
Цели дизайна
[ редактировать ]В стандарте Ecma перечислены следующие цели проектирования C#: [17]
- Язык задуман как простой, современный, объектно-ориентированный язык программирования общего назначения.
- Язык и его реализации должны обеспечивать поддержку принципов разработки программного обеспечения, таких как строгая проверка типов массива , проверка границ , [20] : 58–59 обнаружение попыток использования неинициализированных переменных и автоматическая сборка мусора . [20] : 563 Важны надежность, долговечность и производительность программиста.
- Язык предназначен для использования при разработке программных компонентов, подходящих для развертывания в распределенных средах.
- Переносимость очень важна для исходного кода и программистов , особенно для тех, кто уже знаком с C и C++ .
- Поддержка интернационализации [20] : 314 очень важно.
- C# предназначен для написания приложений как для размещенных, так и для встроенных систем , начиная от очень крупных, использующих сложные операционные системы , и заканчивая очень маленькими, имеющими специальные функции.
- Хотя приложения C# призваны быть экономичными с точки зрения требований к памяти и вычислительной мощности , этот язык не был предназначен для прямой конкуренции по производительности и размеру с C или языком ассемблера. [21]
История
[ редактировать ]Во время разработки .NET Framework изначально библиотеки классов были написаны с использованием управляемого кода системы компилятора под названием Simple Managed C (SMC). [22] [23] В январе 1999 года Андерс Хейлсберг сформировал команду для создания нового на тот момент языка под названием Cool, что расшифровывалось как « C-подобный объектно-ориентированный язык». [24] Microsoft рассматривала возможность сохранения названия «Cool» в качестве окончательного названия языка, но решила не делать этого по причинам, связанным с товарным знаком. К тому времени, когда проект .NET был публично анонсирован на конференции профессиональных разработчиков в июле 2000 года , язык был переименован в C#, а библиотеки классов и среда выполнения ASP.NET были портированы на C#.
Хейлсберг — главный дизайнер C# и ведущий архитектор в Microsoft. Ранее он участвовал в разработке Turbo Pascal , Embarcadero Delphi (ранее CodeGear Delphi, Inprise Delphi и Borland Delphi) и Visual J++ . В интервью и технических документах он заявлял, что недостатки [25] в большинстве основных языков программирования (например, C++ , Java , Delphi и Smalltalk ) были заложены основы Common Language Runtime (CLR), которые, в свою очередь, послужили основой для разработки языка C#.
Джеймс Гослинг , создавший язык программирования Java в 1994 году, и Билл Джой , соучредитель Sun Microsystems , создатель Java, назвали C# «имитацией» Java; Гослинг далее сказал, что «[C# — это] разновидность Java, из которой удалены надежность, производительность и безопасность». [26] [27] В июле 2000 года Хейлсберг заявил, что C# «не является клоном Java» и по своей конструкции «намного ближе к C++». [28]
С момента выпуска C# 2.0 в ноябре 2005 года языки C# и Java развивались по все более разным траекториям, став двумя совершенно разными языками. Одним из первых серьезных отклонений стало добавление дженериков в оба языка с совершенно разными реализациями. C# использует реификацию для предоставления «первоклассных» универсальных объектов, которые можно использовать как любой другой класс, при этом генерация кода выполняется во время загрузки класса. [29] Кроме того, в C# добавлено несколько основных функций для реализации функционального программирования, кульминацией которых стали расширения LINQ , выпущенные вместе с C# 3.0, и поддерживающая их структура лямбда-выражений , методов расширения и анонимных типов . [30] Эти функции позволяют программистам C# использовать методы функционального программирования, такие как замыкания , когда это выгодно для их приложения. Расширения LINQ и функциональный импорт помогают разработчикам сократить объем шаблонного кода , который включается в общие задачи, такие как запрос к базе данных, анализ XML-файла или поиск в структуре данных, смещая акцент на реальную логику программы, чтобы улучшить читаемость. и ремонтопригодность. [31]
Раньше у C# был талисман по имени Энди (в честь Андерса Хейлсберга ). Он был выведен из эксплуатации 29 января 2004 года. [32]
подкомитета ISO/IEC JTC 1 SC 22 . Первоначально C# был представлен на рассмотрение [33] согласно ISO/IEC 23270:2003, [34] был отозван, а затем утвержден в соответствии со стандартом ISO/IEC 23270:2006. [35] Стандарт 23270:2006 отозван под номером 23270:2018 и утвержден с этой версией. [36]
Имя
[ редактировать ]Microsoft впервые использовала название C# в 1988 году для варианта языка C, предназначенного для инкрементной компиляции. [37] Этот проект не был завершен, и позже название было использовано повторно.
Название «до-диез» было навеяно нотной записью, в которой символ диез указывает на то, что написанная нота должна быть сделана на полтона выше по высоте . [38] Это похоже на название языка C++ , где «++» указывает, что переменная должна быть увеличена на 1 после вычисления. Острый символ также напоминает лигатуру из четырех символов «+» (в сетке два на два), что дополнительно подразумевает, что этот язык является развитием C++. [39]
Из-за технических ограничений отображения (стандартные шрифты, браузеры и т. д.), а также из-за отсутствия в большинстве раскладок клавиатуры четкого символа ( U+266F ♯ МУЗЫКАЛЬНЫЙ РЕЗКИЙ ЗНАК ( &острый; )), знак числа ( U + 0023 # ЗНАК НОМЕРА ( # )) был выбран для приближения к острому символу в написанном названии языка программирования. [40] Это соглашение отражено в спецификации языка C# ECMA-334. [17]
Суффикс «острый» использовался рядом других языков .NET, которые являются вариантами существующих языков, включая J# (язык .NET, также разработанный Microsoft и основанный на Java 1.1), A# (из Ada ) и функционального программирования язык F# . [41] Исходная реализация Eiffel для .NET называлась Eiffel#. [42] полный язык Eiffel это имя устарело, поскольку теперь поддерживается . Суффикс также использовался для таких библиотек , как Gtk# .NET ( оболочка для GTK и других библиотек GNOME ) и Cocoa# (оболочка для Cocoa ).
Версии
[ редактировать ]Синтаксис
[ редактировать ]Основной синтаксис языка C# аналогичен синтаксису других языков C-стиля, таких как C, C++ и Java, в частности:
- Точки с запятой используются для обозначения конца оператора.
- Фигурные скобки используются для группировки операторов. Операторы обычно группируются в методы (функции), методы — в классы, а классы — в пространства имен .
- Переменные присваиваются с использованием знака равенства , но сравниваются с использованием двух последовательных знаков равенства .
- Квадратные скобки используются с массивами как для их объявления, так и для получения значения по заданному индексу в одном из них.
Отличительные особенности
[ редактировать ]Вот некоторые примечательные особенности C#, отличающие его от C, C++ и Java, где они отмечены:
Портативность
[ редактировать ]По своему замыслу C# является языком программирования, который наиболее непосредственно отражает базовую инфраструктуру общего языка (CLI). [68] Большинство его внутренних типов соответствуют типам значений, реализованным в среде CLI. Однако в спецификации языка не указаны требования компилятора к генерации кода: то есть не указано, что компилятор C# должен ориентироваться на среду Common Language Runtime, генерировать Common Intermediate Language (CIL) или генерировать какой-либо другой конкретный формат. Некоторые компиляторы C# также могут генерировать машинный код, как традиционные компиляторы C++ или Fortran . [69] [70]
Ввод текста
[ редактировать ]C# поддерживает строгие, неявно типизированные объявления переменных с ключевым словом var
, [16] : 470 и неявно типизированные массивы с ключевым словом new[]
за которым следует инициализатор коллекции. [16] : 80 [20] : 58
Его система типов разделена на два семейства: типы значений, такие как встроенные числовые типы и определяемые пользователем структуры, которые автоматически передаются в виде копий при использовании в качестве параметров, и ссылочные типы, включая массивы, экземпляры классов и строки. , которые только передают указатель на соответствующий объект. Из-за особой обработки оператора равенства строки, тем не менее, для всех практических целей будут вести себя так, как если бы они были значениями. Вы даже можете использовать их в качестве для ящиков этикеток . При необходимости типы значений будут упакованы . автоматически [71]
C# поддерживает строгий логический тип данных . bool
. Операторы, которые принимают условия, такие как while
и if
, требуется выражение типа, реализующего true
оператор, например логический тип. Хотя C++ также имеет логический тип, его можно свободно преобразовывать в целые числа и обратно, а также в такие выражения, как if (a)
требуют только этого a
конвертируется в bool, что позволяет a
быть int или указателем. C# запрещает этот подход «целое число означает истинное или ложное» на том основании, что программистов вынуждают использовать выражения, которые возвращают точно bool
может предотвратить определенные типы ошибок программирования, такие как if (a = b)
(использование присваивания =
вместо равенства ==
).
C# более типобезопасен, чем C++. Единственными неявными преобразованиями по умолчанию являются те, которые считаются безопасными, например расширение целых чисел. Это применяется во время компиляции, во время JIT и, в некоторых случаях, во время выполнения. Не происходит неявных преобразований между логическими значениями и целыми числами, а также между членами перечисления и целыми числами (за исключением литерала 0, который можно неявно преобразовать в любой перечислимый тип). Любое пользовательское преобразование должно быть явно помечено как явное или неявное, в отличие от конструкторов копирования и операторов преобразования C++, которые по умолчанию являются неявными.
В C# имеется явная поддержка ковариации и контравариантности в универсальных типах. [16] : 144 [20] : 23 в отличие от C++, который имеет некоторую степень поддержки контравариантности просто за счет семантики возвращаемых типов виртуальных методов.
Члены перечисления размещаются в своей области видимости .
Язык C# не поддерживает глобальные переменные или функции. Все методы и члены должны быть объявлены внутри классов. Статические члены открытых классов могут заменять глобальные переменные и функции.
Локальные переменные не могут дублировать переменные включающего блока, в отличие от C и C++.
Metaprogramming
[ редактировать ]Метапрограммирование может быть достигнуто несколькими способами:
- Отражение поддерживается через API .NET, которые позволяют использовать такие сценарии, как проверка метаданных типов и вызов динамических методов.
- Деревья выражений [72] представлять код как абстрактное синтаксическое дерево , где каждый узел представляет собой выражение, которое можно проверить или выполнить. Это позволяет динамически изменять исполняемый код во время выполнения. Деревья выражений привносят некоторую гомоиконичность . в язык
- Атрибуты — это метаданные , которые можно прикреплять к типам, членам или целым сборкам , что эквивалентно аннотациям в Java . Атрибуты доступны как компилятору, так и коду посредством отражения. Многие собственные атрибуты дублируют функциональность директив препроцессора GCC и VisualC++, зависящих от платформы. [ нужна ссылка ]
System.Reflection.Emit
пространство имен, [73] который содержит классы, которые выдают метаданные и CIL (типы, сборки и т. д.) во время выполнения .- Платформа компилятора .NET (Roslyn) предоставляет доступ API к службам компиляции языков, позволяя компилировать код C# из приложений .NET. Он предоставляет API для синтаксического ( лексического ) анализа кода, семантического анализа , динамической компиляции в CIL и генерации кода. [74]
- Генераторы источников, [75] функция компилятора Roslyn C#, позволяющая выполнять метапрограммирование во время компиляции. В процессе компиляции разработчики могут проверять компилируемый код с помощью API компилятора и передавать для компиляции дополнительный сгенерированный исходный код C#.
Методы и функции
[ редактировать ]Метод в C# — это член класса, который может быть вызван как функция (последовательность инструкций), а не просто возможность хранения значения поля ( т. е. класса или переменной экземпляра ). [76] Как и в других синтаксически подобных языках, таких как C++ и ANSI C , сигнатура метода представляет собой объявление, содержащее по порядку: любые необязательные ключевые слова доступности (например, private
), явная спецификация возвращаемого типа (например, int
или ключевое слово void
если значение не возвращается), имя метода и, наконец, заключенная в круглые скобки последовательность спецификаций параметров, разделенных запятыми, каждая из которых состоит из типа параметра, его формального имени и, возможно, значения по умолчанию, которое будет использоваться, если ничего не указано. В отличие от большинства других языков, параметры вызова по ссылке должны быть отмечены как в определении функции, так и на вызывающем сайте, и вы можете выбирать между ref
и out
, последний позволяет передать неинициализированную переменную, которая при возврате будет иметь определенное значение. [77] Кроме того, вы можете указать список аргументов переменного размера , применив params
ключевое слово до последнего параметра. [78] Определенные виды методов, например те, которые просто получают или устанавливают значение поля, возвращая или присваивая его, не требуют явно указанной полной подписи, но в общем случае определение класса включает объявление полной сигнатуры его класса. методы. [79]
Как и в C++ и в отличие от Java, программисты C# должны использовать ключевое слово-модификатор области видимости. virtual
чтобы разрешить переопределение методов подклассами . В отличие от C++, вам необходимо явно указать ключевое слово override
при этом. [80] Предполагается, что это позволит избежать путаницы между переопределением и новой перегрузкой функции (т.е. сокрытием предыдущей реализации). Для последнего необходимо указать new
ключевое слово. [81]
Методы расширения в C# позволяют программистам использовать статические методы, как если бы они были методами из таблицы методов класса, позволяя программистам виртуально добавлять методы экземпляра в класс, который, по их мнению, должен существовать в объектах такого типа (и экземплярах соответствующих производных классов). . [16] : 103–105 [20] : 202–203
Тип dynamic
позволяет привязывать методы во время выполнения, позволяя выполнять вызовы методов в стиле JavaScript и композицию объектов во время выполнения . [16] : 114–118
на строго типизированные В C# имеется поддержка указателей функции с помощью ключевого слова delegate
. псевдо-C++ платформы Qt Подобно сигналу и слоту , C# имеет семантику, конкретно связанную с событиями стиля публикации-подписки, хотя C# для этого использует делегаты.
C# предлагает Java-подобный synchronized
вызовы методов через атрибут [MethodImpl(MethodImplOptions.Synchronized)]
и поддерживает взаимоисключающие блокировки с помощью ключевого слова lock
.
Свойство
[ редактировать ]C# поддерживает классы со свойствами . Свойства могут быть простыми функциями доступа с вспомогательным полем или реализовывать произвольные функции получения и установки. Свойство доступно только для чтения, если нет установщика. Как и в случае с полями, здесь могут быть свойства класса и экземпляра. Базовые методы могут быть virtual
или abstract
как и любой другой метод. [79]
Начиная с C# 3.0 синтаксический сахар автоматически реализуемых свойств. доступен [82] где аксессор (геттер) и мутатор (сеттер) инкапсулируют операции над одним атрибутом класса.
Пространство имен
[ редактировать ]AC# namespace
обеспечивает тот же уровень изоляции кода, что и Java. package
или С++ namespace
, с очень похожими правилами и функциями на package
. Пространства имен можно импортировать с помощью синтаксиса «using». [83]
Доступ к памяти
[ редактировать ]В C# указатели адресов памяти можно использовать только внутри блоков, специально помеченных как небезопасные . [84] а программам с небезопасным кодом для запуска необходимы соответствующие разрешения. Большая часть доступа к объектам осуществляется через безопасные ссылки на объекты, которые всегда либо указывают на «живой» объект, либо имеют четко определенное нулевое значение; невозможно получить ссылку на «мертвый» объект (который был собран мусором) или на случайный блок памяти. Небезопасный указатель может указывать на экземпляр неуправляемого типа значения, который не содержит никаких ссылок на объекты, подлежащие сборке мусора, такие как экземпляры классов, массивы или строки. Код, который не помечен как небезопасный, все равно может хранить указатели и манипулировать ими через System.IntPtr
type, но он не может их разыменовать.
Управляемая память не может быть освобождена явно; вместо этого он автоматически убирается мусором. Сборка мусора решает проблему утечек памяти , освобождая программиста от ответственности за освобождение памяти, которая в большинстве случаев больше не нужна. Код, который сохраняет ссылки на объекты дольше, чем требуется, по-прежнему может использовать больше памяти, чем необходимо, однако после освобождения последней ссылки на объект память становится доступной для сборки мусора.
Исключения
[ редактировать ]Программистам доступен ряд стандартных исключений. Методы в стандартных библиотеках в некоторых случаях регулярно вызывают системные исключения, и диапазон выдаваемых исключений обычно документируется. Пользовательские классы исключений могут быть определены для классов, позволяющих при необходимости применять обработку для конкретных обстоятельств. [85]
Синтаксис обработки исключений: try {
что-нибудь } catch (Exception ex) {
ручка ex } finally {
сделать что-то независимо от того, произошло исключение или нет }
. В зависимости от ваших планов, часть «catch» или «finally» может быть опущена, и может быть несколько частей «catch», обрабатывающих различные виды исключений.
[86]
Проверяемые исключения отсутствуют в C# (в отличие от Java). Это было сознательное решение, основанное на вопросах масштабируемости и версионности. [87]
Полиморфизм
[ редактировать ]В отличие от C++ , C# не поддерживает множественное наследование , хотя класс может реализовывать любое количество « интерфейсов » (полностью абстрактных классов). Это было дизайнерское решение ведущего архитектора языка, призванное избежать сложностей и упростить архитектурные требования для всего интерфейса командной строки.
При реализации нескольких интерфейсов, содержащих метод с одинаковым именем и принимающих параметры одного и того же типа в одном и том же порядке (т. е. одной и той же сигнатуры ), подобно Java , C# позволяет как один метод охватывать все интерфейсы, так и, при необходимости, конкретные методы для каждый интерфейс.
Однако, в отличие от Java, C# поддерживает перегрузку операторов . [88]
C# также предлагает перегрузку функций (так называемый специальный полиморфизм). [89]
Начиная с версии 2.0, C# предлагает параметрический полиморфизм , то есть классы с произвольными или ограниченными параметрами типа, например List<T>
, массив переменного размера, который может содержать только элементы типа T
. Существуют определенные виды ограничений, которые вы можете указать для параметров типа: должен быть тип X ( или производный от него ), должен реализовывать определенный интерфейс, должен быть ссылочным типом, должен быть типом значения, должен быть реализовать общедоступный конструктор без параметров . Большинство из них можно комбинировать, и вы можете указать любое количество интерфейсов. [90] [91]
Языковой интегрированный запрос (LINQ)
[ редактировать ]C# имеет возможность использовать LINQ через .NET Framework. Разработчик может запрашивать различные источники данных при условии, что IEnumerable<T>
интерфейс реализован на объекте. Сюда входят документы XML, набор данных ADO.NET и базы данных SQL. [92]
Использование LINQ в C# дает такие преимущества, как поддержка IntelliSense , широкие возможности фильтрации, безопасность типов с возможностью проверки ошибок компиляции и согласованность запросов данных из различных источников. [93] Существует несколько различных языковых структур, которые можно использовать с C# и LINQ, и это выражения запросов, лямбда-выражения, анонимные типы, неявно типизированные переменные, методы расширения и инициализаторы объектов. [94]
LINQ имеет два синтаксиса: синтаксис запроса и синтаксис метода. Однако компилятор всегда преобразует синтаксис запроса в синтаксис метода во время компиляции. [95]
using System.Linq;
var numbers = new int[] { 5, 10, 8, 3, 6, 12 };
// Query syntax (SELECT num FROM numbers WHERE num % 2 = 0 ORDER BY num)
var numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
// Method syntax
var numQuery2 =
numbers
.Where(num => num % 2 == 0)
.OrderBy(n => n);
Функциональное программирование
[ редактировать ]Хотя C# в первую очередь является императивным языком, со временем в него всегда добавляются функциональные возможности. [96] [97] например:
- Функционирует как первоклассный гражданин — делегаты C# 1.0 [98]
- Функции высшего порядка — C# 1.0 вместе с делегатами
- Анонимные функции — анонимные делегаты C# 2 и лямбда-выражения C# 3. [99]
- Замыкания — C# 2 вместе с анонимными делегатами и C# 3 вместе с лямбда-выражениями. [99]
- Вывод типа — C# 3 с неявно типизированными локальными переменными.
var
и новые выражения целевого типа в C# 9.new()
- Понимание списков — C# 3 LINQ
- Кортежи — .NET Framework 4.0, но он стал популярным, когда в C# 7.0 появился новый тип кортежа с поддержкой языка. [100]
- Вложенные функции — C# 7.0 [100]
- Сопоставление с образцом — C# 7.0 [100]
- Неизменяемость — структура C# 7.2 только для чтения, типы записей C# 9. [101] и инициализируют только установщики [102]
- Классы типов — роли/расширения C# 12 (в разработке). [103] )
Система общего типа
[ редактировать ]В C# имеется единая система типов . Эта унифицированная система типов называется системой общих типов (CTS). [104] : Часть 2, Глава 4: Система типов
Единая система типов подразумевает, что все типы, включая примитивы, такие как целые числа, являются подклассами System.Object
сорт. Например, каждый тип наследует ToString()
метод.
Категории типов данных
[ редактировать ]CTS разделяет типы данных на две категории: [104]
- Типы ссылок
- Типы значений
Экземпляры типов значений не имеют ни ссылочной идентичности, ни семантики ссылочного сравнения. Сравнения на равенство и неравенство для типов значений сравнивают фактические значения данных внутри экземпляров, если только соответствующие операторы не перегружены. Типы значений происходят от System.ValueType
, всегда имеют значение по умолчанию и всегда могут быть созданы и скопированы. Некоторые другие ограничения типов значений заключаются в том, что они не могут быть производными друг от друга (но могут реализовывать интерфейсы) и не могут иметь явный конструктор по умолчанию (без параметров), поскольку у них уже есть неявный конструктор, который инициализирует все содержащиеся данные зависимым от типа значением по умолчанию ( 0, ноль или подобное). Примерами типов значений являются все примитивные типы, такие как int
(32-битное целое число со знаком), float
(32-битное число IEEE с плавающей запятой), char
(16-битный код Unicode), decimal
(числа с фиксированной точкой, полезные для обработки денежных сумм) и System.DateTime
(определяет конкретный момент времени с точностью до наносекунды). Другими примерами являются enum
(перечисления) и struct
(структуры, определяемые пользователем).
Напротив, ссылочные типы имеют понятие ссылочной идентичности, что означает, что каждый экземпляр ссылочного типа по своей сути отличается от любого другого экземпляра, даже если данные в обоих экземплярах одинаковы. Это отражается в сравнениях равенства и неравенства по умолчанию для ссылочных типов, которые проверяют ссылочное, а не структурное равенство, если только соответствующие операторы не перегружены (например, в случае с System.String
). Некоторые операции не всегда возможны, например создание экземпляра ссылочного типа, копирование существующего экземпляра или выполнение сравнения значений двух существующих экземпляров. Тем не менее, определенные ссылочные типы могут предоставлять такие услуги, предоставляя открытый конструктор или реализуя соответствующий интерфейс (например, ICloneable
или IComparable
). Примеры ссылочных типов: object
(основной базовый класс для всех остальных классов C#), System.String
(строка символов Юникода) и System.Array
(базовый класс для всех массивов C#).
Обе категории типов можно расширять с помощью определяемых пользователем типов.
Упаковка и распаковка
[ редактировать ]Упаковка — это операция преобразования объекта типа значения в значение соответствующего ссылочного типа. [104] Упаковка в C# является неявной.
Распаковка — это операция преобразования значения ссылочного типа (ранее упакованного) в значение типа значения. [104] Распаковка в C# требует явного приведения типа . Упакованный объект типа T можно распаковать только до T (или T, допускающего значение NULL). [105]
Пример:
int foo = 42; // Value type.
object bar = foo; // foo is boxed to bar.
int foo2 = (int)bar; // Unboxed back to value type.
Библиотеки
[ редактировать ]Спецификация C# подробно описывает минимальный набор типов и библиотек классов, которые компилятор ожидает иметь. На практике C# чаще всего используется с некоторой реализацией Common Language Infrastructure (CLI), которая стандартизирована как ECMA-335 Common Language Infrastructure (CLI) .
В дополнение к стандартным спецификациям CLI существует множество коммерческих и общественных библиотек классов, построенных на основе библиотек платформы .NET и обеспечивающих дополнительную функциональность. [106]
C# может выполнять вызовы к любой библиотеке, включенной в Список библиотек и платформ .NET .
Примеры
[ редактировать ]Привет, мир
[ редактировать ]Ниже приведена очень простая программа на C#, версия классического примера « Привет, мир », использующая функцию операторов верхнего уровня, представленную в C# 9: [107]
using System;
Console.WriteLine("Hello, world!");
Для кода, написанного на C# 8 или ниже, логика точки входа программы должна быть записана в методе Main внутри типа:
using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello, world!");
}
}
Этот код отобразит этот текст в окне консоли:
Hello, world!
Каждая строка имеет свое назначение:
using System;
Приведенная выше строка импортирует все типы в System
пространство имен. Например, Console
класс, используемый позже в исходном коде, определен в файле System
пространство имен, что означает, что его можно использовать без указания полного имени типа (которое включает пространство имен).
// A version of the classic "Hello World" program
Эта строка является комментарием; он описывает и документирует код для программиста(ов).
class Program
Выше приведено определение класса для Program
сорт. Все, что следует за парой фигурных скобок, описывает этот класс.
{
...
}
Фигурные скобки обозначают границы блока кода. В этом первом случае они отмечают начало и конец Program
сорт.
static void Main()
Здесь объявляется метод члена класса, с которого программа начинает выполнение. Среда выполнения .NET вызывает Main
метод. В отличие от Java , Main
метод не требует public
ключевое слово, которое сообщает компилятору, что метод может быть вызван из любого места любым классом. [108] Письмо static void Main(string[] args)
эквивалентно написанию private static void Main(string[] args)
. Ключевое слово static делает метод доступным без экземпляра Program
. Каждое консольное приложение Main
точка входа должна быть объявлена static
в противном случае программе потребуется экземпляр Program
, но для любого экземпляра потребуется программа. Чтобы избежать этой неразрешимой циклической зависимости , компиляторы C#, обрабатывающие консольные приложения (как показано выше), сообщают об ошибке, если нет static Main
метод. void
Ключевое слово заявляет, что Main
не имеет возвращаемого значения . (Однако обратите внимание, что короткие программы могут быть написаны с использованием операторов верхнего уровня, представленных в C# 9, как упоминалось ранее.)
Console.WriteLine("Hello, world!");
Эта строка записывает вывод. Console
это статический класс в System
пространство имен. Он обеспечивает интерфейс для стандартного ввода/вывода и потоки ошибок для консольных приложений. Программа вызывает Console
метод WriteLine
, который выводит на консоль строку с аргументом, строку "Hello, world!"
.
Дженерики
[ редактировать ]Благодаря .NET 2.0 и C# 2.0 сообщество получило более гибкие коллекции, чем в .NET 1.x. Из-за отсутствия дженериков разработчикам приходилось использовать такие коллекции, как ArrayList, для хранения элементов как объектов неопределенного типа, что приводило к снижению производительности при упаковке/распаковке/проверке типа содержащихся элементов.
Generics представили в .NET новую масштабную функцию, которая позволила разработчикам создавать типобезопасные структуры данных. Этот сдвиг особенно важен в контексте преобразования устаревших систем, где обновление универсальных структур может значительно повысить производительность и удобство обслуживания за счет замены устаревших структур данных более эффективными и типобезопасными альтернативами. [109]
Пример
public class DataStore<T>
{
private T[] items = new T[10];
private int count = 0;
public void Add(T item)
{
items[count++] = item;
}
public T Get(int index)
{
return items[index];
}
}
графический интерфейс
[ редактировать ]Windows Пример графического интерфейса :
using System;
using System.Windows.Forms;
class Program
{
static void Main()
{
MessageBox.Show("Hello, World!");
Console.WriteLine("Is almost the same argument!");
}
}
Этот пример аналогичен предыдущему, за исключением того, что он создает диалоговое окно , содержащее сообщение «Hello, World!» вместо того, чтобы писать его в консоль.
Изображения
[ редактировать ]
Еще одна полезная библиотека — System.Drawing
библиотека, которая используется для программного рисования изображений. Например:
using System;
using System.Drawing;
public class Example
{
public static Image img;
static void Main()
{
img = Image.FromFile("Image.png");
}
}
Это создаст изображение, идентичное изображению, хранящемуся в «Image.png».
Стандартизация и лицензирование
[ редактировать ]В августе 2001 года Microsoft , Hewlett-Packard и Intel совместно выступили спонсорами подачи спецификаций C#, а также Common Language Infrastructure (CLI) в организацию по стандартизации Ecma International . В декабре 2001 года ECMA выпустила спецификацию языка C# ECMA-334 . C# стал стандартом ISO / IEC в 2003 году (ISO/IEC 23270:2003 – Информационные технологии. Языки программирования – C# ). ECMA ранее приняла эквивалентные спецификации в качестве второго издания C# в декабре 2002 года. В июне 2005 года ECMA утвердила третье издание спецификации C# и обновила ECMA-334. Дополнения включали частичные классы, анонимные методы, типы, допускающие значение NULL, и дженерики C++ (что-то похожее на шаблоны ). В июле 2005 года ECMA представила ISO/IEC JTC 1/SC 22, используя ускоренный процесс последнего, стандарты и соответствующие ТУ. Обычно этот процесс занимает 6–9 месяцев.
Определение языка C# и CLI стандартизированы в соответствии со стандартами ISO / IEC и Ecma , которые обеспечивают разумную и недискриминационную лицензионную защиту от патентных претензий.
Microsoft изначально согласилась не подавать в суд на разработчиков открытого исходного кода за нарушение патентов в некоммерческих проектах на ту часть фреймворка, на которую распространяется обещание открытой спецификации . [110] Microsoft также согласилась не применять патенты, относящиеся к продуктам Novell , к платящим клиентам Novell. [111] за исключением списка продуктов, в которых явно не упоминаются C#, .NET или реализация .NET от Novell ( Проект Mono ). [112] Однако Novell утверждает, что Mono не нарушает никаких патентов Microsoft. [113] Microsoft также заключила конкретное соглашение не обеспечивать соблюдение патентных прав, связанных с плагином браузера Moonlight , который зависит от Mono, при условии, что он будет получен через Novell. [114]
Десять лет спустя Microsoft начала разработку бесплатных кроссплатформенных инструментов с открытым исходным кодом для C#, а именно Visual Studio Code , .NET Core и Roslyn . Mono присоединился к Microsoft как проект Xamarin , дочерней компании Microsoft.
Реализации
[ редактировать ]Microsoft возглавляет разработку эталонных открытым исходным кодом компиляторов C# и набора инструментов с . Первый компилятор, Roslyn , компилирует в промежуточный язык (IL), а второй, RyuJIT, [115] — это JIT-компилятор (точно в срок), который является динамическим, выполняет оптимизацию «на лету» и компилирует IL в собственный код для внешнего интерфейса ЦП. [116] RyuJIT имеет открытый исходный код и написан на C++. [117] Roslyn полностью написан на управляемом коде (C#), открыт, а его функциональные возможности реализованы в виде API. Таким образом, это позволяет разработчикам создавать инструменты рефакторинга и диагностики. [4] [118] Двумя ветвями официальной реализации являются .NET Framework (с закрытым исходным кодом, только для Windows) и .NET Core (с открытым исходным кодом, кроссплатформенный); в конечном итоге они объединились в одну реализацию с открытым исходным кодом: .NET 5.0. [119] В .NET Framework 4.6 новый JIT-компилятор заменил прежний. [115] [120]
Другие компиляторы C# (некоторые из которых включают реализацию Common Language Infrastructure и библиотек классов .NET):
- Mono , проект, спонсируемый Microsoft, предоставляет компилятор C# с открытым исходным кодом, полную реализацию CLI с открытым исходным кодом (включая необходимые библиотеки платформы, как они указаны в спецификации ECMA) и почти полную реализацию библиотек классов NET. в .NET Framework 3.5.
- Цепочка инструментов Elements из RemObjects включает RemObjects C#, который компилирует код C# в .NET Common Intermediate Language , байт-код Java , Cocoa , байт-код Android , WebAssembly и собственный машинный код для Windows, macOS и Linux.
- Проект DotGNU (сейчас прекращенный) также предоставил компилятор C# с открытым исходным кодом, почти полную реализацию Common Language Infrastructure, включая необходимые библиотеки платформы, как они указаны в спецификации ECMA, и подмножество некоторых оставшихся собственных классов .NET Microsoft. библиотеки до .NET 2.0 (те, которые не задокументированы и не включены в спецификацию ECMA, но включены в стандартный дистрибутив Microsoft .NET Framework).
использует Игровой движок Unity C# в качестве основного языка сценариев. В игровой движок Godot реализован дополнительный модуль C# благодаря пожертвованию Microsoft в размере 24 000 долларов. [121]
См. также
[ редактировать ]
|
|
Примечания
[ редактировать ]- ^ для асинхронности
- ^ По соглашению числовой знак для второго символа в обычном тексте используется настоящий диез ; в художественных изображениях иногда употребляется : C♯. Однако стандарт ECMA 334 гласит: «Имя C# записывается как ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА C (U+0043), за которой следует ЦИФРОВОЙ ЗНАК # (U+0023)».
- ^ Языковые версии 1.0, 2.0 и 5.0 доступны как ISO/IEC 23270. Начиная с версии 7.0, спецификация доступна как ISO/IEC 20619.
- ^ Документ спецификации Microsoft C# 2.0 содержит только новые функции 2.0. Для более старых функций используйте приведенную выше спецификацию 1.2.
Ссылки
[ редактировать ]Цитаты
[ редактировать ]- ^ «InfoQ eMag: предварительный обзор C# 7» . Архивировано из оригинала 24 апреля 2023 года . Проверено 11 ноября 2016 г.
- ^ «Анонсируем C# 12» . Проверено 18 ноября 2023 г.
- ^ Торгерсен, Мадс (27 октября 2008 г.). «Новые возможности C# 4.0» . Майкрософт . Архивировано из оригинала 3 января 2012 года . Проверено 28 октября 2008 г.
- ^ Jump up to: а б «Компилятор Roslyn .NET предоставляет языкам C# и Visual Basic богатые API-интерфейсы анализа кода.: dotnet/roslyn» . 13 ноября 2019 года. Архивировано из оригинала 22 февраля 2021 года . Получено 13 февраля 2015 г. - через GitHub.
- ^ «CoreCLR — это среда выполнения для .NET Core. Она включает в себя сборщик мусора, JIT-компилятор, примитивные типы данных и классы низкого уровня.: dotnet/coreclr» . 13 ноября 2019 года. Архивировано из оригинала 14 октября 2019 года . Получено 8 марта 2017 г. - через GitHub.
- ^ Jump up to: а б Науглер, Дэвид (май 2007 г.). «C# 2.0 для программиста C++ и Java: семинар-конференция». Журнал компьютерных наук в колледжах . 22 (5).
Хотя C# находился под сильным влиянием Java, на него также сильно повлиял C++, и его лучше всего рассматривать как потомка C++ и Java.
- ^ Гамильтон, Наоми (1 октября 2008 г.). «Языки программирования: C#» . Компьютерный мир . Архивировано из оригинала 24 марта 2010 года . Проверено 12 февраля 2010 г.
Здесь мы все стоим на плечах гигантов, и каждый язык основан на том, что было до него, поэтому мы во многом обязаны C, C++, Java, Delphi и всем остальным, что было до нас. ( Андерс Хейлсберг )
- ^ «Спецификация часовни (Благодарность)» (PDF) . Cray Inc., 1 октября 2015 г. Архивировано из оригинала (PDF) 5 февраля 2016 г. . Проверено 14 января 2016 г.
- ^ «Вопросы и ответы Рича Хикки от Майкла Фогуса» . Архивировано из оригинала 11 января 2017 года . Проверено 11 января 2017 г.
- ^ Боренцвейг, Ари (14 июня 2016 г.). «Выпущен Кристалл 0.18.0!» . Архивировано из оригинала 25 декабря 2018 года . Проверено 7 августа 2017 г.
Он во многом вдохновлен Ruby и другими языками (например, C#, Go и Python).
- ^ «Веб-языки и виртуальные машины: быстрый код всегда в моде. (V8, Dart) — Google I/O 2013» . Ютуб . Архивировано из оригинала 21 декабря 2021 года . Проверено 22 декабря 2013 г.
- ^ В Java 5.0 добавлено несколько новых функций языка ( улучшенный цикл for , автобоксинг , varargs и аннотации ) после того, как они были представлены в аналогичном (и конкурирующем) языке C# [1]. Архивировано 19 марта 2011 г. на Wayback Machine [2]. Архивировано 7 января 2006 г. в Wayback Machine.
- ^ Корнелиус, Барри (1 декабря 2005 г.). «Java 5 догоняет C#» . Оксфордского университета Вычислительные службы . Архивировано из оригинала 6 марта 2023 года . Проверено 18 июня 2014 г.
По моему мнению, именно C# стал причиной таких радикальных изменений в языке Java. ( Барри Корнелиус )
- ^ «Влияния — Справочник по ржавчине» . Справочник по ржавчине . Архивировано из оригинала 26 января 2019 года . Проверено 18 апреля 2023 г.
- ^ Латтнер, Крис (3 июня 2014 г.). «Домашняя страница Криса Латтнера» . Крис Лэттнер. Архивировано из оригинала 25 декабря 2018 года . Проверено 12 мая 2020 г.
Язык Swift — это продукт неустанных усилий команды языковых экспертов, гуру документации, ниндзя по оптимизации компиляторов и невероятно важной внутренней экспериментальной группы, которая предоставляла отзывы, помогающие совершенствовать и проверять идеи. Конечно, он также получил большую пользу от опыта, с трудом полученного многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C#, CLU и многих других, чтобы их перечислять.
- ^ Jump up to: а б с д и ж г Скит 2019 .
- ^ Jump up to: а б с д и Спецификация языка C# (PDF) (4-е изд.). Экма Интернешнл . Июнь 2006 г. Архивировано (PDF) из оригинала 21 апреля 2021 г. Проверено 26 января 2012 г.
- ^ Доллард, Кэтлин (14 ноября 2023 г.). «Анонсируем C# 12» . .NET-блог . Архивировано из оригинала 18 ноября 2023 года . Проверено 18 ноября 2023 г.
- ^ Сет, Гаурав (14 ноября 2023 г.). «Анонс .NET 8» . .NET-блог . Архивировано из оригинала 19 ноября 2023 года . Проверено 18 ноября 2023 г.
- ^ Jump up to: а б с д и ж Альбахари 2022 .
- ^ «Цели проектирования C#» . www.java-samples.com . Архивировано из оригинала 6 октября 2021 года . Проверено 6 октября 2021 г.
- ^ Зандер, Джейсон (22 ноября 2007 г.). «Пара исторических фактов» . Архивировано из оригинала 29 июля 2020 года . Проверено 23 февраля 2009 г.
- ^ «На каком языке изначально был написан ASP.Net?» . 28 ноября 2006 г. Архивировано из оригинала 24 июня 2016 г. Проверено 21 февраля 2008 г.
- ^ Гамильтон, Наоми (1 октября 2008 г.). «Языки программирования: C#» . Компьютерный мир . Архивировано из оригинала 18 мая 2019 года . Проверено 1 октября 2008 г.
- ^ "Подробности" . nilsnaegele.com . Архивировано из оригинала 7 апреля 2019 года . Проверено 7 апреля 2019 г.
- ^ «Почему Microsoft C# нет» . vrenture.com/: CBS Interactive. 2002. Архивировано из оригинала 14 августа 2023 года . Проверено 18 сентября 2023 г.
- ^ Билл Джой (7 февраля 2002 г.). «Слепое пятно Microsoft» . cnet.com. Архивировано из оригинала 14 августа 2023 года . Проверено 18 сентября 2023 г.
- ^ Осборн, Джон (1 августа 2000 г.). «Глубоко внутри C#: интервью с главным архитектором Microsoft Андерсом Хейлсбергом» . О'Рейли Медиа. Архивировано из оригинала 9 января 2010 года . Проверено 14 ноября 2009 г.
- ^ «Обобщенные шаблоны (Руководство по программированию на C#)» . Майкрософт. Архивировано из оригинала 26 августа 2011 года . Проверено 21 марта 2011 г.
- ^ Дон Бокс и Андерс Хейлсберг (февраль 2007 г.). «LINQ: запрос, интегрированный в язык .NET» . Майкрософт. Архивировано из оригинала 24 августа 2011 года . Проверено 21 марта 2011 г.
- ^ Мерсер, Ян (15 апреля 2010 г.). «Почему функциональное программирование и LINQ часто лучше процедурного кода» . abodit.com. Архивировано из оригинала 11 июля 2011 года . Проверено 21 марта 2011 г.
- ^ «Энди уходит на пенсию» . Блог Дэна Фернандеса . Блоги.msdn.com. 29 января 2004 года. Архивировано из оригинала 19 января 2016 года . Проверено 4 октября 2012 г.
- ^ «Технические комитеты — JTC 1/SC 22 — Языки программирования, их среды и интерфейсы системного программного обеспечения» . ИСО. Архивировано из оригинала 27 сентября 2012 года . Проверено 4 октября 2012 г.
- ^ «ISO/IEC 23270:2003 – Информационные технологии – Спецификация языка C#» . Исо.орг. 23 августа 2006. Архивировано из оригинала 8 мая 2012 года . Проверено 4 октября 2012 г.
- ^ «ISO/IEC 23270:2006 – Информационные технологии – Языки программирования – C#» . Исо.орг. 26 января 2012. Архивировано из оригинала 6 декабря 2010 года . Проверено 4 октября 2012 г.
- ^ «SO/IEC 23270:2018 Информационные технологии. Языки программирования. C#» . ИСО . Проверено 26 ноября 2020 г.
- ^ Мариани, Рико (5 октября 2009 г.). «Моя история Visual Studio (Часть 1) – Интересные факты о производительности Рико Мариани» . Интересные факты о выступлении Рико Мариани . Архивировано из оригинала 27 мая 2018 года . Проверено 26 мая 2018 г.
- ^ Ковач, Джеймс (7 сентября 2007 г.). «Урок истории C#/.NET» . Архивировано из оригинала 6 марта 2009 года . Проверено 18 июня 2009 г.
- ^ Хейлсберг, Андерс (1 октября 2008 г.). «Языки программирования: C#» . Компьютерный мир . Архивировано из оригинала 2 апреля 2015 года . Проверено 22 июня 2014 г.
- ^ «Часто задаваемые вопросы по Microsoft C#» . Майкрософт . Архивировано из оригинала 14 февраля 2006 года . Проверено 25 марта 2008 г.
- ^ «Часто задаваемые вопросы по F#» . Исследования Майкрософт. Архивировано из оригинала 18 февраля 2009 года . Проверено 18 июня 2009 г.
- ^ Саймон, Рафаэль; Стапф, Эммануэль; Мейер, Бертран (июнь 2002 г.). «Полный Эйфель на .NET Framework» . Майкрософт . Архивировано из оригинала 21 июля 2009 года . Проверено 18 июня 2009 г.
- ^ «Что нового в языке и компиляторе C# 2.0» . Майкрософт. Архивировано из оригинала 18 декабря 2010 года . Проверено 11 июня 2014 г.
- ^ Хейлсберг, Андерс; Торгерсен, Мадс (30 апреля 2007 г.). «Обзор C# 3.0» . Сеть разработчиков Microsoft . Майкрософт. Архивировано из оригинала 25 июня 2014 года . Проверено 11 июня 2014 г.
- ^ Jump up to: а б «Использование C# 3.0 из .NET 2.0» . Дэниелмот.com. 13 мая 2007 года. Архивировано из оригинала 29 сентября 2012 года . Проверено 4 октября 2012 г.
- ^ Хейлсберг, Андерс (15 сентября 2011 г.). «Будущие направления развития C# и Visual Basic» . Канал 9 . СТРОЙ2011. Майкрософт. Архивировано из оригинала 23 сентября 2011 года . Проверено 21 сентября 2011 г.
- ^ «Введение в новые возможности C# 5.0» . Блог программы Microsoft MVP Award . Майкрософт. 26 марта 2012. Архивировано из оригинала 4 июня 2014 года . Проверено 11 июня 2014 г.
- ^ «Функции языков в C# 6 и VB 14» . Гитхаб . дотнет/рослин. Архивировано из оригинала 12 января 2016 года . Проверено 13 февраля 2015 г.
- ^ «Что нового в C# 7» . Документы Майкрософт . 21 декабря 2016 г. Архивировано из оригинала 1 ноября 2017 г.
- ^ Торгерсен, Мадс (9 марта 2017 г.). «Новые возможности C# 7.0» . .NET-блог . Майкрософт. Архивировано из оригинала 11 апреля 2017 года . Проверено 9 июня 2017 г.
- ^ «Примечания к выпуску Visual Studio 2017 версии 15.0» . Microsoft Learn . 11 апреля 2023 года. Архивировано из оригинала 20 апреля 2023 года . Проверено 19 апреля 2023 г.
- ^ «Что нового в C# 7.1» . Документы Майкрософт . Архивировано из оригинала 10 октября 2017 года . Проверено 9 октября 2017 г.
- ^ «Примечания к выпуску Visual Studio 2017 версии 15.3» . Microsoft Learn . 11 апреля 2023 года. Архивировано из оригинала 21 марта 2023 года . Проверено 19 апреля 2023 г.
- ^ «Что нового в C# 7.2» . Документы Майкрософт . Архивировано из оригинала 1 декабря 2017 года . Проверено 26 ноября 2017 г.
- ^ «Примечания к выпуску Visual Studio 2017 версии 15.5» . Microsoft Learn . 11 апреля 2023 года. Архивировано из оригинала 20 апреля 2023 года . Проверено 19 апреля 2023 г.
- ^ «Что нового в C# 7.3» . Документы Майкрософт . Архивировано из оригинала 23 июня 2018 года . Проверено 23 июня 2018 г.
- ^ «Примечания к выпуску Visual Studio 2017 версии 15.7» . Microsoft Learn . 13 июля 2022 года. Архивировано из оригинала 20 апреля 2023 года . Проверено 19 апреля 2023 г.
- ^ «Что нового в C# 8.0» . Документы Майкрософт . 9 марта 2023 года. Архивировано из оригинала 6 сентября 2020 года . Проверено 14 апреля 2019 г.
- ^ «Примечания к выпуску Visual Studio 2019 версии 16.3» . Microsoft Learn . 11 апреля 2023 года. Архивировано из оригинала 20 апреля 2023 года . Проверено 19 апреля 2023 г.
- ^ БиллВагнер. «Что нового в C# 9.0 — Руководство по C#» . Microsoft Learn . Архивировано из оригинала 5 сентября 2020 года . Проверено 15 октября 2020 г.
- ^ «Примечания к выпуску Visual Studio 2019 версии 16.8» . Microsoft Learn . 11 апреля 2023 года. Архивировано из оригинала 20 апреля 2023 года . Проверено 19 апреля 2023 г.
- ^ «Что нового в C# 10» . Microsoft Learn . Архивировано из оригинала 8 февраля 2022 года . Проверено 10 ноября 2021 г.
- ^ «Примечания к выпуску Visual Studio 2022 версии 17.0» . Microsoft Learn . Архивировано из оригинала 16 июля 2023 года . Проверено 19 апреля 2023 г.
- ^ «Что нового в C# 11» . Microsoft Learn . Архивировано из оригинала 15 августа 2022 года . Проверено 8 августа 2022 г.
- ^ «Примечания к выпуску Visual Studio 2022 версии 17.4» . Microsoft Learn . Архивировано из оригинала 6 августа 2023 года . Проверено 19 апреля 2023 г.
- ^ «Что нового в C# 12» . Microsoft Learn . Архивировано из оригинала 20 июля 2023 года . Проверено 29 июня 2023 г.
- ^ «Примечания к выпуску Visual Studio 2022 версии 17.6» . Microsoft Learn . Архивировано из оригинала 6 августа 2023 года . Проверено 29 июня 2023 г.
- ^ Новак и др. 2010 .
- ^ Стивихимс; mattwojo (20 октября 2022 г.). «Компиляция приложений с помощью .NET Native — приложений UWP» . Learn.microsoft.com . Архивировано из оригинала 27 октября 2023 года . Проверено 27 октября 2023 г.
- ^ ЛакшанФ; агоке; Рик-Андерсон; и др. (12 сентября 2023 г.). «Обзор развертывания собственного AOT — .NET» . Learn.microsoft.com . Архивировано из оригинала 11 ноября 2023 года . Проверено 27 октября 2023 г.
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ «Типы/Общие, часть официальной документации C#» . Майкрософт . Архивировано из оригинала 29 марта 2024 года . Проверено 6 апреля 2024 г.
- ^ БиллВагнер. «Деревья выражений (C#)» . Microsoft Learn . Архивировано из оригинала 15 мая 2021 года . Проверено 14 мая 2021 г.
- ^ дотнет-бот. «Пространство имен System.Reflection.Emit» . Learn.microsoft.com . Архивировано из оригинала 28 апреля 2023 года . Проверено 28 апреля 2023 г.
- ^ Макаллистер, Нил (20 октября 2011 г.). «Рослин от Microsoft: заново изобретая компилятор, каким мы его знаем» . Инфомир . Архивировано из оригинала 5 марта 2022 года . Проверено 5 марта 2022 г.
- ^ «Знакомство с генераторами исходного кода C#» . .NET-блог . 29 апреля 2020 года. Архивировано из оригинала 7 мая 2021 года . Проверено 14 мая 2021 г.
- ^ «Классы/поля, часть официальной документации C#» .
- ^ "out (Справочник по C#)" .
- ^ «Модификатор параметров/параметров метода, часть официальной документации C#» .
- ^ Jump up to: а б «Классы/свойства, часть официальной документации C#» .
- ^ «виртуальный (Справочник по C#)» . Microsoft Learn . 15 сентября 2021 года. Архивировано из оригинала 30 августа 2018 года . Проверено 4 апреля 2018 г.
- ^ « новый модификатор, часть официальной документации C#» .
- ^ «Автоматически реализуемые свойства (Руководство по программированию на C#)» . Архивировано из оригинала 29 октября 2020 года . Проверено 12 сентября 2020 г.
- ^ «Директива using — Справочник по C#» . Документы Майкрософт . Архивировано из оригинала 14 апреля 2019 года . Проверено 14 апреля 2019 г.
- ^ БиллВагнер. «Небезопасный код, указатели на данные и указатели на функции» . Microsoft Learn . Архивировано из оригинала 4 июля 2021 года . Проверено 20 июня 2021 г.
- ^ «Как создавать пользовательские исключения» . Архивировано из оригинала 26 января 2021 года . Проверено 12 сентября 2020 г.
- ^ [hhttps://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/Exception-handling-statements «Операторы обработки исключений, часть официальной документации C#»]. Microsoft Learn . Проверено 26 июня 2024 г.
- ^ Веннерс, Билл; Экель, Брюс (18 августа 2003 г.). «Проблема с проверенными исключениями» . Архивировано из оригинала 18 февраля 2015 года . Проверено 30 марта 2010 г.
- ^ БиллВагнер. «Перегрузка операторов — справочник по C#» . Microsoft Learn . Архивировано из оригинала 24 июня 2021 года . Проверено 20 июня 2021 г.
- ^ «Разрешение выражений/перегрузки, часть официальной документации C#» . Microsoft Learn . Проверено 7 апреля 2024 г.
- ^ «Типы/сконструированные типы, часть официальной документации C#» . Microsoft Learn . Проверено 7 апреля 2024 г.
- ^ «Ограничения параметров классов/типов, часть официальной документации C#» . Microsoft Learn . Проверено 7 апреля 2024 г.
- ^ Чжан, Сюэ Донг; Тенг, Цзы Му; Чжао, Донг Ван (сентябрь 2014 г.). «Исследование технологии доступа к базам данных в рамках .NET Framework». Прикладная механика и материалы . 644–650: 3077–3080. doi : 10.4028/www.scientific.net/AMM.644-650.3077 . S2CID 62201466 . ПроКвест 1565579768 .
- ^ Оти, Майкл (февраль 2006 г.). «LINQ в будущее». Журнал SQL Server . Том. 8, нет. 2. стр. 17–21. ПроКвест 214859896 .
- ^ Шелдон, Уильям (ноябрь 2010 г.). «Новые возможности LINQ». Журнал SQL Server . Том. 12, нет. 11. С. 37–40. ПроКвест 770609095 .
- ^ БиллВагнер (15 сентября 2021 г.). «Синтаксис запроса и синтаксис метода в LINQ (C#)» . Learn.microsoft.com . Архивировано из оригинала 23 мая 2023 года . Проверено 23 мая 2023 г.
- ^ Эрикдитрих (9 марта 2023 г.). «История C# — Руководство по C#» . Learn.microsoft.com . Архивировано из оригинала 28 апреля 2023 года . Проверено 28 апреля 2023 г.
- ^ Функциональное путешествие C# — Мадс Торгерсен — NDC Copenhagen 2022 , заархивировано из оригинала 15 мая 2023 г. , получено 15 мая 2023 г.
- ^ «Красота замыканий» . csharpineepep.com . Архивировано из оригинала 19 мая 2023 года . Проверено 28 апреля 2023 г.
- ^ Jump up to: а б БиллВагнер. «Анонимные функции — Руководство по программированию на C#» . Microsoft Learn . Архивировано из оригинала 15 апреля 2021 года . Проверено 15 мая 2021 г.
- ^ Jump up to: а б с «Что нового в C# 7.0» . Документы Майкрософт . Архивировано из оригинала 6 августа 2020 года . Проверено 14 апреля 2019 г.
- ^ «C# 9.0 в записи» . .NET-блог . 10 ноября 2020 года. Архивировано из оригинала 15 мая 2021 года . Проверено 15 мая 2021 г.
- ^ БиллВагнер (30 июня 2022 г.). «Ключевое слово init — Справочник по C#» . Learn.microsoft.com . Архивировано из оригинала 19 мая 2023 года . Проверено 19 мая 2023 г.
- ^ Платформа компилятора .NET , Платформа .NET, 28 апреля 2023 г., заархивировано из оригинала 28 апреля 2023 г. , получено 28 апреля 2023 г.
- ^ Jump up to: а б с д Арчер 2001 .
- ^ Липперт, Эрик (19 марта 2009 г.). «Представительство и идентичность» . Невероятные приключения в программировании . Блоги.msdn.com. Архивировано из оригинала 12 июля 2011 года . Проверено 4 октября 2012 г.
- ^ «Библиотеки фреймворков» . Microsoft Learn . 19 апреля 2023 года. Архивировано из оригинала 14 июля 2019 года . Проверено 14 июля 2019 г.
- ^ БиллВагнер. «Что нового в C# 9.0 — Руководство по C#» . Microsoft Learn . Архивировано из оригинала 5 сентября 2020 года . Проверено 14 мая 2021 г.
- ^ БиллВагнер. «Main() и аргументы командной строки» . Microsoft Learn . Архивировано из оригинала 5 августа 2021 года . Проверено 5 августа 2021 г.
- ^ «Раскрытие возможностей универсальных шаблонов C#: комплексное руководство» . 24 апреля 2024 г.
- ^ «Патентный залог для разработчиков открытого исходного кода» . 16 марта 2023 года. Архивировано из оригинала 7 декабря 2017 года . Проверено 28 октября 2017 г.
- ^ «Соглашение о патентной кооперации — сотрудничество Microsoft и Novell в области обеспечения совместимости» . Майкрософт . 2 ноября 2006 года. Архивировано из оригинала 17 мая 2009 года . Проверено 5 июля 2009 г.
Microsoft от имени себя и своих Дочерних компаний (совместно именуемых «Microsoft») настоящим обязуется не подавать в суд на Клиентов Novell и Клиентов Дочерних компаний Novell за нарушение Защищенных патентов Microsoft в связи с использованием Клиентом конкретных копий Соответствующего продукта, распространяемые компанией Novell или ее дочерними компаниями (совместно именуемые «Novell»), за которые Novell получила доход (прямо или косвенно) за такие конкретные копии; при условии, что вышеуказанное соглашение ограничивается использованием таким Заказчиком (i) таких конкретных копий, которые разрешены Novell в счет получения такого Дохода, и (ii) в пределах объема, разрешенного Novell в счет такого Дохода.
- ^ «Определения» . Майкрософт . 2 ноября 2006 г. Архивировано из оригинала 4 ноября 2012 г. Проверено 5 июля 2009 г.
- ^ Стейнман, Джастин (7 ноября 2006 г.). «Novell отвечает на вопросы сообщества» . Архивировано из оригинала 16 июля 2013 года . Проверено 5 июля 2009 г.
Мы утверждаем, что Mono не нарушает никаких патентов Microsoft.
- ^ «Соглашение с последующими получателями лунного света — сотрудничество Microsoft и Novell в области обеспечения совместимости» . Майкрософт . 28 сентября 2007. Архивировано из оригинала 23 сентября 2010 года . Проверено 8 марта 2008 г.
«Последующий получатель» означает юридическое или физическое лицо, которое использует по назначению реализацию Moonlight, полученную непосредственно от Novell или через промежуточного получателя... Microsoft оставляет за собой право обновить (в том числе прекратить действие) вышеизложенное соглашение... «Реализация Moonlight». означает только те конкретные части Moonlight 1.0 или Moonlight 1.1, которые запускаются только как плагин к браузеру на Персональном компьютере и не лицензируются по GPLv3 или аналогичной лицензии.
- ^ Jump up to: а б «Переход на RyuJIT завершен!» . microsoft.com . 19 июня 2018 года. Архивировано из оригинала 19 июля 2019 года . Проверено 20 июля 2021 г.
- ^ «Управляемый процесс исполнения» . microsoft.com . Архивировано из оригинала 23 декабря 2017 года . Проверено 20 июля 2021 г.
- ^ "coreclr/src/jit/" . github.com . Архивировано из оригинала 9 января 2019 года . Проверено 20 июля 2021 г.
- ^ «Руководство по C#» . Microsoft Learn . Архивировано из оригинала 13 августа 2022 года . Проверено 28 июля 2017 г.
- ^ «5.0.8» . microsoft.com . Архивировано из оригинала 23 апреля 2020 года . Проверено 20 июля 2021 г.
- ^ «Снижение последствий: новый 64-битный JIT-компилятор» . microsoft.com . Архивировано из оригинала 5 апреля 2018 года . Проверено 20 июля 2021 г.
- ^ Эчеверри, Игнасио (21 октября 2017 г.). «Введение в C# в Godot» . Двигатель Годо . Архивировано из оригинала 26 октября 2018 года . Проверено 26 октября 2018 г.
Источники
[ редактировать ]- Альбахари, Джозеф (2022). C# 10 в двух словах (первое изд.). О'Рейли. ISBN 978-1-098-12195-2 .
- Арчер, Том (2001). «Часть 2, Глава 4: Система типов». Внутри С# . Редмонд, Вашингтон: Microsoft Press. ISBN 0-7356-1288-9 .
- Новак, Иштван; Велварт, Андрас; Гранич, Адам; Баласси, Дьёрдь; Хайдрик, Аттила; Селлерс, Митчелл; Хиллар, Гастон К.; Мольнар, Агнес; Канджилал, Джойдип (2010). Visual Studio 2010 и .NET 4 «шесть в одном» . Врокс Пресс. ISBN 978-0470499481 .
- Скит, Джон (2019). C# в глубине (Четвертое изд.). Мэннинг. ISBN 978-1617294532 .
Дальнейшее чтение
[ редактировать ]- Дрейтон, Питер; Альбахари, Бен; Ньюворд, Тед (2002). Карманный справочник по языку C# . О'Рейли. ISBN 0-596-00429-Х .
- Петцольд, Чарльз (2002). Программирование Microsoft Windows на C# . Майкрософт Пресс. ISBN 0-7356-1370-2 .
Внешние ссылки
[ редактировать ]- Семейство языков программирования C Sharp
- программное обеспечение 2000 года
- Американские изобретения
- Языки программирования
- Языки программирования высокого уровня
- Языки программирования .NET
- Языки программирования на основе классов
- Стандарты Экма
- Функциональные языки
- стандарты МЭК
- стандарты ИСО
- Языки программирования Майкрософт
- Мультипарадигмальные языки программирования
- Языки программирования, созданные в 2000 году.
- Языки программирования со стандартом ISO
- Статически типизированные языки программирования
- Скомпилированные языки программирования