C

С Сибирьска википедья
Айдать на коробушку Айдать на сыскальник

C# (произносится как «Си-шарп») — это объектно-ориентированный язык программирования со статической типизацией, разработанный на рубеже 1990-х и 2000-х годов для программной платформы Microsoft .NET. Являясь языком прикладного уровня, он сочетает в себе строгую объектную модель, поддержку полиморфизма и широкие возможности компонентно-визуальной разработки.

Происхождение названия и история создания

Разработка языка началась в декабре 1998 года. Первоначально проект носил рабочее название «Cool», что являлось аббревиатурой от «C-style Object Oriented Language» (Объектно-ориентированный язык в стиле Си). В 2000 году, одновременно с анонсом платформы .NET, язык был официально представлен под названием C#. В 2002 году он стал доступен широкому кругу разработчиков в составе среды программирования Visual Studio .NET.

Название «C#» имеет двойное смысловое происхождение. С одной стороны, символ решетки (Sharp) отсылает к музыкальной нотации, где диез означает повышение ноты на полутон (в латинской нотации ноте «до» соответствует буква C). Таким образом, название трактуется как «улучшенный Си». С другой стороны, графическое начертание символа «#» можно представить как четыре знака плюс («+»), расположенных в форме квадрата, что символически указывает на эволюционное развитие языка C++, то есть «C++++».

Несмотря на название и визуальное сходство синтаксиса (использование фигурных скобок), C# концептуально далек от оригинального языка C. С архитектурной точки зрения язык является развитием идей Java (ранние версии C# часто называли «Java, адаптированной под платформу .NET») и среды визуальной разработки Delphi. Именно из Delphi была заимствована концепция удобной сборки графического интерфейса из готовых компонентов, что позволило C# стать основным инструментом разработки корпоративных приложений, вытеснив саму Delphi с рынка. Кроме того, на строгую объектно-ориентированную модель языка оказал влияние Smalltalk.

Архитектура и среда выполнения

Фундаментальным отличием C# от компилируемых языков (таких как C или C++) является архитектура его исполнения. Программный код на C# не транслируется напрямую в машинный код процессора. Вместо этого он компилируется в специальный низкоуровневый платформонезависимый байт-код — Common Intermediate Language (CIL), который фактически представляет собой ассемблер для платформы .NET.

Выполнение этого промежуточного кода осуществляется виртуальной машиной Common Language Runtime (CLR). Именно среда CLR берет на себя выполнение критически важных операций, таких как автоматическая сборка мусора (высвобождение неиспользуемой памяти) и управление системой типов. Глубокая интеграция с CIL означает, что базовые типы данных в C# являются прямым отражением системы типов промежуточного ассемблера платформы .NET.

На сегодняшний день, помимо официальной реализации от Microsoft (включая современные компиляторы, такие как Roslyn), существуют независимые кроссплатформенные реализации компиляторов и сред исполнения, среди которых наиболее известны проекты Mono и DotGNU.

Эволюция версий языка

Развитие языка шло по пути непрерывного включения в него наиболее удачных парадигм и конструкций из других языков программирования:

  • Первая версия (2000–2002 гг.) базировалась на концепциях Java, однако уже содержала такие элементы, как свойства, индексаторы, события, делегаты, специализированный цикл перебора коллекций, а также возможности из C++ (перегрузка операторов и оператор безусловного перехода).
  • Версия 2.0 (октябрь 2003 г.) привнесла поддержку 64-разрядных систем, обнуляемые типы данных (nullable) и обобщения (дженерики). В отличие от шаблонов C++, обобщения в C# были реализованы на уровне виртуальной машины.
  • Версия 3.0 (2004 г.) добавила мощные средства для интеграции с базами данных, внедрив в язык синтаксические конструкции, аналогичные SQL (ключевые слова для выборок и фильтрации данных). Также появились инициализаторы объектов, лямбда-выражения, деревья выражений и неявная типизация.
  • Версия 4.0 (2010 г., в составе Visual Studio 2010) добавила механизмы позднего связывания и контракты в коде.
  • Версии 6.0 и 7.0 существенно расширили функциональность: появились условные операторы на проверку нулевого значения, интерполяция строк, локальные функции, кортежи, бинарные литералы и оператор получения строкового имени переменной. Был внедрен механизм сопоставления с шаблоном (pattern matching).
  • Версия 9.0 представила тип данных «запись» (record) — неизменяемый по умолчанию тип, концептуально заимствованный из языка Pascal. Было добавлено ключевое слово для инициализации свойств только в момент создания объекта.
  • Версии 10.0–12.0 продолжили расширять возможности структур, записей (добавлено наследование и методы с телом) и интерфейсов. Появились статические абстрактные виртуальные методы в интерфейсах, позволяющие, в частности, перегружать математические операции для нестандартных числовых множеств.

Парадигма и синтаксические конструкции

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

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

Концептуальные примеры использования специфических конструкций:

 // Пример использования встроенных операторов выборок, аналогичных SQL
 var results = select item from database;
 
 // Пример интерполяции строк и использования оператора nameof
 string errorMessage = $"Ошибка в переменной {nameof(myVariable)}";
 
 // Концепция типа записи (record) с инициализацией (init)
 record Person(string Name);

Преимущества и недостатки

К сильным сторонам языка относятся читабельность, краткость кода и отсутствие необходимости ручного управления памятью. Язык предлагает идеальную инфраструктуру для визуальной компонентной разработки корпоративного программного обеспечения (особенно с использованием технологий ASP.NET для веб-разработки) и глубокую интеграцию с экосистемой Microsoft .NET. Наличие богатой стандартной библиотеки («крупного завода готовых компонентов») и мощных инструментов отладки делает C# одним из лучших языков для начального изучения программирования.

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

Кроме того, язык часто подвергается концептуальной критике со стороны противников объектно-ориентированного программирования. Отмечается, что строгая иерархичность приводит к созданию избыточных абстракций. В качестве классического примера критики приводится ситуация, когда для решения простой практической задачи («пнуть кирпич») парадигма ООП заставляет программиста описывать сложную иерархию сущностей (создавать объект «кирпич», наследовать его от объекта «глина» и т.д.), что неоправданно увеличивает объем кода и усложняет архитектуру там, где требуется простая функциональная логика. Наконец, сильная зависимость от платформы .NET утяжеляет разрабатываемые приложения и процесс компиляции.

См. также

C++ Снобол

Смотреть видео