С# живет, пользуясь принципом «всякая сущность есть объект». Его считают объектно-ориентированным языком, а если выразиться точнее - объектным языком программирования. Принято говорить, что язык базируется на жёсткой компонентной архитектуре и осуществляет передовые механизмы поддержания безопасности кода. Правда у скептиков есть сомнения как минимум на счёт его безопасности.
Сторонники C# относят его к самым продвинутым, универсальным, мультипарадигменным и удобным в применении языкам программирования. Принимая во внимание тот факт, что за этим языком стоит платформа Microsoft.NET, количество таких сторонников достаточно большое.
Еще в 60-х годах появились далекие предки C#. А началось всё с появлением языка B, созданного в 1969 году коллективом исследователей из Технологического института Массачусетса (MIT). Кен Томпсон является главным автором B. В то время команда разрабатывала операционную систему UNIX. Язык PL/I, уже существовавший и применявшийся тогда для мэйнфреймов, изготовленных компанией IBM, меньше подходил для решения поставленной задачи, кроме того был достаточно громоздким. Исходя из этого, ученые решили поработать над созданием нового языка, получившего название B. Это типичный представитель ранних императивных языков программирования.
Как это ни странно, последователем B стал изобретенный в 1972 году язык программирования C. В его основу положен сам B.
Язык C создали Денис Ритчи и Кен Томпсон, работники исследовательской лаборатории компании под названием AT&T (AT&T Bell Telephone Laboratories). Над созданием расширенной версии B Ритчи начал свою работу в 1971 году. Сначала разработчик назвал её NB (New B), но после того как язык получил большие отличия от B, название заменили на C. B получил расширение за счет явного применения структур, типов и ряда новых операций.
Питер Мойлан писал в своей книге «The case against C» по поводу создания языка Си о том, что люди нуждались в языке, способном обойти некоторые строгие правила, встроенные в большую часть языков высокого уровня и поддерживающих их надежность. Требовался язык, позволяющий делать то, что реализовать до него можно было лишь на уровне машинного кода или на ассемблере.
Иллюстрация из книги «Язык Си»: С. Прата, M. Уэйт, Д. Мартин
Бьярне Страуструп (Bell Labs) в 1984 году выступил с демонстрацией проекта языка С++. В период занятий исследованиями в фирме, Страуструп написал несколько имитационных программ, которые требовались для моделирования распределенных вычислений. Для решения подобных задач идеальным инструментом мог бы стать объектно-ориентированный язык программирования SIMULA-67, если бы он не характеризовался сравнительно низкой скоростью выполнения программ.
Если вы вынуждены делать выбор между написанием «быстрого» и «хорошего» кода, - это означает, что что-то идёт не так. Поскольку, согласно позиции Страуструпа, «хороший» код обязательно является «быстрым».
Так был создан С++, - язык программирования, которому первоначально дали название С with classes («Си с классами»). А придумал название «С++» Рик Мэсчитти. "++" является оператором инкремента в С, словно намекающий на то обстоятельство, что язык С++, что-то большее, чем просто С.
Начало нового тысячелетия Microsoft решила отметить выпуском новоявленных программных продуктов. К 2000-му году компанией были подготовлены промышленные модификации новых решений и компонентных технологий в сфере обмена сообщениями и информацией, а также изготовления Internet-приложений (ASP+, COM+, SOAP, ADO+, Biztalk Framework). С целью поддержки этих новшеств компания Microsoft выпустила платформу .NET - инструментарий для разработки приложений. Эта платформа совместила «под общей крышей» несколько языков программирования, что для того времени было в новинку.
Технология активных серверных страниц (Active Server Page) ASP.NET также стала ещё одним нововведением платформы. Посредством неё можно было довольно быстро разработать взаимодействующие с базами данных веб-приложения.
C# - язык программирования созданный специально для ASP.NET. Следует отметить, что и сама ASP.NET также была полностью написана на этом языке.
Название «Си шарп» (в пер. с англ. sharp — диез) заключает в себе «сакральный» смысл. В музыкальной нотации знак «#» читается как «диез» и обозначает повышение на полтона высоты звука. Можно рассмотреть образование названия «C#» и с другой стороны, как производное следующей череды трансформаций: C → C++ → C++++(C#), поскольку символ «#» является совокупностью 4-х знаков «+».
Поскольку есть технические ограничения на отображение (браузеры, стандартные шрифты и т. д.) а также по причине того, что знак диез ♯ на стандартной клавиатуре не представлен, был выбран знак # для представления знака диез при написании имени языка программирования. Зафиксировали это соглашение в Спецификации Языка C# ECMA-334. Поскольку названия языков программирования переводить не принято, язык следует по-английски называть «Си шарп».
Авторы этого языка программирования – Вилтамут Скотт и Хейльсберг Андерс — создатель Дельфи и Турбо Паскаля, в 1996 году перешедший в Microsoft.
Согласно одной из версий, замысел этого языка и даже новой платформы (которую назвали.NET) он вынашивал, еще находясь на должности в компании Borland.
Языком C# поддерживаются все три основных составляющих объектно-ориентированного программирования: полиморфизм, наследование и инкапсуляция. Кроме того, в нем реализован замысел автоматической «сборки мусора», динамического связывания и обработки исключений.
C# как и Java, предназначался изначально для веб-разработки, и около 75% его синтаксических возможностей подобны языку программирования Java. Кроме того его называют «очищенной разновидностью Java». 5% позаимствовано из Visual Basic, а 10% из C++. Примерно 10% C# – это воплощение собственных задумок разработчиков.
Несмотря на весьма значительные различия между компонентной объектной формой COM (основной стандарт Microsoft для реализации программного обеспечения и компонентного проектирования) и моделью Java, рассматриваемые языки программирования во многом сходны между собой.
Единая среда исполнения программ базируется на применении промежуточного языка IL (с англ. Intermediate Language — промежуточный язык), выполняющего практически ту же функцию, что и байт-код виртуальной машины Java. Применяемые в пределах технологии .NET компиляторы транслируют с различных языков программы в IL-код. IL-код по такому же принципу, как и байт-код Java, являет собой команды гипотетической стековой вычислительной машины. Однако в устройстве и применении IL имеются и различия.
В первую очередь, IL в отличие от JVM, к одному языку программирования не привязан. Предварительные версии Microsoft.NET включают в себя компиляторы языков Visual Basic, Си#, Си++. Независимыми разработчиками могут добавляться другие языки, при этом, они могут создавать свои компиляторы в IL-код.
Кроме того, IL предназначается не для программной интерпретации, а для дальнейшей компиляции в машинный код. Такое применение промежуточного языка позволяет достичь гораздо большего быстродействия программ. Файлы, содержащие IL-код, несут достаточно данных для функционирования оптимизирующего компилятора.
По мнению Кика Рэдек из Microsoft С# - более сложный язык, нежели Java. Он считает, что «язык Java сделан так, чтобы обезопасить создателя от выстрела в свою ногу» (англ. «Java was built to keep a developer from shooting himself in the foot»), а «С# был создан так, чтобы разработчик получил пистолет, оставленный на предохранителе» (англ. «C# was built to give the developer a gun but leave the safety turned on»).
Началом работы над C# стал декабрь 1998 года. COOL – вот такое закодированное название дали данному проекту (C-style Object Oriented Language).
Первую бета-версию C# 1.0 выпустили летом 2000 года, а окончательную версию языка совместно с Microsoft Visual Studio мир увидел в феврале 2002. Так как в C# сочетаются лучшие стороны предыдущих популярных языков программирования, таких как Java, C и C++, программисты с легкостью могут переходить на C#, руководствуясь знаниями любого из указанных языков.
Возможность написания компонентов стала главной отличительной чертой от предшественников. В C# также добавились такие средства, как свойства, методы и события.
Окончательный релиз версии C# 2.0 вышел в свет в 2005 году. Это событие сделало его позицию на рынке более прочной. Добавились новые возможности, такие как частичные и параметризованные типы и анонимные методы обобщения, значительно расширившие возможности применения C#.
Вторую версию расширили поддержкой 64-х разрядных вычислений, что позволило увеличить адресное пространство. Кроме того, в ней реализовали создание триггеров, типов данных и хранимых процедур на .NET языках.
Вышедшая в 2008 году версия 3.0 предоставила для C# возможность занять лидирующую позицию в соревновании языков программирования. К числу нововведений C# 3.0 относится язык интегрированных запросов (LINQ), а также методы расширения и не явно типизированные переменные; Lambda-выражения, назначающие реализацию кода делегатам посредством нового, облегчённого варианта синтаксиса. Особенные отличия получили Lambda-выражения совместно с языком интегрированных запросов.
Избавление от громоздкости и откровенного дискомфорта при описании переменных обеспечили анонимные типы переменных, предоставив возможность извещать о новом типе непосредственно при его создании. Также к числу новшеств в C# 3.0 относятся и «ленивые вычисления», производящие необходимые вычисления только в случаях запросов нужной соответствующей информации.
Новая версия C# 4.0 была выпущена в 2010 году. Главным дополняющим её фактором в сравнении с предыдущими версиями стали необязательные и именованные аргументы. Первые позволяют указать аргумент, используемый для каждого параметра по умолчанию, а вторые предоставляют возможность привязать параметр и аргумент по имени. Не менее значимое нововведение – тип dynamic. Благодаря его наличию можно выполнять проверку соответствия типов объектов непосредственно в период выполнения программы, а не на этапе компиляции.
Параллельно добавились нововведения в .NET Framework 4.0 – параллельная разновидность языка интегрированных запросов (PLNQ) и библиотека распараллеливания задач (TPL). Их поддержка предоставляет возможность реализовать параллельность исполнения кода в компьютерах с несколькими одноядерными или с многоядерными процессорами.
В 2012 году появилась версия C# 5.0, в которой добавлено совсем немного новшеств:
• операция получения сведений о вызывающем объекте;
• асинхронные методы;
• Версия C# 6.0
Данную версию выпустили спустя три года после выпуска в 2015 пятой версии. Основные нововведения 6-й версии:
• инициализация свойств со значениями;
В версии C# 6.0 добавили возможность проводить инициализацию свойств со значениями. Это новшество способствует избавлению от ошибки с null и пустыми значениями свойства.
• интерполяция строк;
Ежедневно мы сталкиваемся с конкатенацией строк. Некоторые в основном используют оператор “+”, другие применяют метод string.Format(). Хотя проблемы с ним известны всем: при чрезмерно большом количестве параметров усложняется понимание, значения каждого из чисел – {1}, {2}, {3}. Новшество, придуманное в C# 6.0 должно совместить достоинства обоих методов;
• применение лямбда-выражений;
Свойства и методы в C# 6.0 можно определять, используя лямбда-выражения. Данная возможность способствует сильному уменьшению количества кода.
• импорт статических классов;
Всех статических членов класса можно определить посредством другого статического класса. Однако мы вынуждены всякий раз повторять имя данного статического класса. Большое количество свойств вынуждает довольно часто повторять то же самое.
В C# 6.0 добавили возможность импортировать статические классы посредством ключевого слова using.
• null-условный оператор;
В версию языка C# 6.0 ввели новый так называемый Null-условный оператор (?.), работающий поверх условного оператора (?:) и предназначенный для облегчения проверки на NULL значения.
Null-условный оператор возвращает значение null, в случае если объект класса, к которому применяется оператор, равняется null.
• nameof оператор;
Чтобы пресечь возможность образования в коде строковых литералов свойств в C# 6.0 будет использоваться оператор nameof. Данный оператор призван возвращать строковый литерал передаваемого в него элемента. Можно в качестве параметра передать какой-либо член класса либо сам класс.
• await в catch и finally блоках;
В предыдущих версиях C# оператор await был недоступен для применения в блоках catch и final. Использовать это нововведение можно с целью освобождения ресурсов либо для ведения логов ошибок.
• фильтры исключений;
В CLR фильтры исключений были, однако присутствовали только в VB. Теперь такую возможность добавили в C#, что позволяет на исключения накладывать дополнительный фильтр.
• инициализация Dictionary.
В C# 6.0 ввели возможность проводить инициализацию Dictionary по ключу значения. Такое новшество должно способствовать упрощению инициализации словарей.
Кроме того Microsoft усовершенствовала производительность нового компилятора.
В 2016 году известили о нововведениях готовящейся версии С# 7.0:
• локальные функции;
• бинарные литералы;
Эти новшества позволяют структурировать код, к примеру, в стиле JavaScript.
• сопоставление с образцом (Pattern matching);
С появлением этой функции можно применять различные средства для сопоставления.
• условия и применение объектов в переключателях;
Мини революция для разработчиков. Теперь switch практически ничем не ограничен. Можно применять сопоставления.
• записи;
Автоматическое произведение простых классов с произвольными полями.
• кортежи.
Иногда нужно вернуть из метода несколько значений. Для упрощения данной задачи в C# 7 появились кортежи и литералы кортежей.
Согласно записи в блоге Михаила Флёнова, все большее число компаний для крупных проектов останавливает свой выбор на платформе Microsoft.NET. И здесь всё просто - Java утратил свободу при переходе под крыло Oracle. Ранее, до перехода, Sun расходовал огромные ресурсы на язык Java, и много было сделано ради открытого кода, свободы и просто Java. С уходом под крыло Oracle язык в конечном итоге потерял, и скорость его развития заметно понизилась.
Microsoft в случае с .NET делает гораздо больше усилий. Развитие языка происходит всё ещё в довольно серьёзных масштабах, компанией выпущен бесплатный редактор кода, применимый под все платформы. В настоящее время Microsoft начинает вкладываться в открытость, и для освобождения .NET делает всё возможное.
Сейчас трудно сказать, что ожидает Windows в будущем, однако на данный момент эта платформа всё ещё остаётся самой популярной. К тому же C# также увеличивает свою популярность. Компания Майкрософт продолжает вкладывать средства и в собственную мобильную платформу. И если, по мнению Михаила Флёнова, эти их действия увенчаются успехом, то C# может выстрелить ещё более серьёзно.