C Sharp

C♯ («Си-шарп» и некоторые его ни разу не верные произношения: Шарик, Си-сярп, Си-решетка, До-диез, Си-диез, Цэ-решетка, Си-вафля, Цесарка, Сисетка, C-Pound) — мейнстримовый язык для промышленной разработки на платформе :w:.Net, объединивший в себе мощь Java и простоту C++. Наряду с жаббой же является стандартом де-факто энтерпрайза (чем и обуславливаются высококультурные диалоги между адептами противоборствующих сторон). В силу своей молодости ещё достаточно девственен, но уже успел затрахать всех. Люто, бешено ненавидим линуксоидами.
По большому счёту — это Жаба с припаянным сбоку С++ и парой (функциональных => фич).
Давным-давно корпорация «Sun» решила разработать язык для стиральных машинок, но ввиду отсутствия в те времена в них интернетов, «изобретение» плавно переехало на сервера. Разработки его велись более 5 лет с привлечением истинных гуру вроде Никлауса Вирта, чья реализация сборщика мусора попала в код первых версий. Java начала свою историю как язык для корпоративного сектора (если пропустить самое начало, когда он был языком для микроволновок), энтырпрайзность зашкаливала за все границы: писали громадные спеки и стандарты и всё ковалось закрыто в Sun Microsystems. Технологически это всё же было лучше чем то, что создавалось до этого — особенно для задач, когда нужно писать бизнес-логику и не думать о том, завалится оно или нет, как завалится и что делать.
В то время набрал обороты Microsoft, вплоть до полного доминирования на рынке почти всего в IT. Жабба им нравилась, или по крайней мере они хотели захватить над ней контроль (применив к ней свою любимую стратегию EEE). После пары неудачных попыток (ака Microsoft Java и J++) они решили сделать свою жабу c указателями и делегатами и назвали её .NET.
Жаба тех лет отличалась невменяемостью стандартов, странными инженерными решениями (доступ к файлам через потоки, загрузка картинок в фоновом режиме и так далее), и исправлять было что. Саму жабу вылечить от этого нельзя, потому что полностью навернётся обратная совместимость и придётся ставить 10 версий одновременно. Кроме того, исправленную Java было бы крайне сложно отличить от .NET. Ну и плюс, она существует под множество платформ и менять её непросто.
.NET сделали за два года, и это было именно то, что надо для большинства Windows VS/Delphi-программистов. Чуждые UNIX-паттерны, которыми пахнет Java, изучать не нужно. Плюс .NET имел много хороших фич вроде (лямбд => и замыканий), которых в жаббе не было до восьмой версии. По сравнению с Java, .NET — это отсутствие мук выбора, «one true way», бо́льшая выразительность языка, лёгкий доступ к unsafe, хорошая поддержка десктопного GUI. С другой стороны — зависимость от MS, вера дотнетчиков, что тот опенсорс, который они видят для .NET, это The OpenSource, а не детский сад в песочке с лопатками (как ни кричи на форумах о Mono — твоя платформа винда и тчк). Но в ноябре 2014 года Microsoft перевел .NET Framework под MIT-лицензию и стал неспешно открывать исходный код фреймворка. Злые языки говорят — потому что сами они даже минимально необходимый уровень функциональности и качества для удержания своего положения на этом рынке поддерживать уже не способны. Так что остается надеяться, что через годик-другой приложения .NET на UNIX, станут делом более-менее обыденным, что б там джаверы себе не думали.
Алсо, во имя исторической справедливости надо вспомнить, что идеологически Java и .NET — полные противоположности: Java — множество платформ для единого языка, .NET — единая платформа для множества языков. Но на самом деле, что одно, что второе — множество языков для множества платформ.
Изначально C# казался неоднозначным: почти полный клон Java без всякой кросплатформенности, но с парой новых фреймворков: WinForms и ASP.NET WebForms, который превращал веб-программирование в подобие десктопного. Сейчас они выглядят нелепо, но тогда этот подход обернулся вином. Во второй версии Мелкомягкие добавили в язык ещё синтаксического сахара и довели до ума ASP.NET. И уже с .NET второй версии началось отставание Java как языка. Затем в .NET 3.5 появился LINQ (основной аргумент шарпистов в срачах с жаббаистами) и три фреймворка: десктопный WPF, сервисный WCF и вебовский MVC. Наконец, .NET 4.0 кардинально упростил параллельное программирование, а .NET 4.5 — асинхронное.
Существует и альтернативная версия, что создатель C# придумал .NET, пока работал на Borland. Но там его не поняли, и он ушел в Microsoft писать J++, а потом умело пропихнул свою идею и всё заверте... И что были даже какие-то разборки между Borland и Microsoft на тему авторства.
Но в любом случае, последующая история — заслуга Большой Конторы, а не одного автора лично.
C# имеет ни больше, ни меньше три разных синтаксиса. Ну или, если хотите, существует три языка с абсолютно идентичными возможностями и структурой, но разным синтаксисом. Этот майндфак стал реальностью благодаря очередной попытке Мелкософта решить важную мировую проблему: дефицит программистов. Цимес в том, что программистом может стать далеко не каждый (речь, разумеется, не о быдлокодерах). Нужно совмещение в человеке взаимоисключающих параметров, вроде технического склада ума и чувства прекрасного (подобный склад мышления должен быть свойственен, например, архитекторам, но на практике…). Но кроме того, что программеров мало, они ещё и пишут на разных языках. То есть жаббаист нихуя не способен педалить РНР-сайт, обратное верно. Конечно, можно заставить программера выучить новый язык под проект, но во-первых, эти гады, пользуясь дефицитом на рынке труда, могут спокойно послать работодателя в жопу и перейти к конкуренту через дорогу, а во-вторых, учить язык он будет недели 2-4, причём за счёт компании. И вот какого-то сумрачного мелкософтовского гения осенило: а пусть программеры пишут на любом языке, всё равно всё скомпилируется в один и тот же байткод. Профит очевиден: нужно искать не жаббаиста, или PHPетушка, или обгвидка, а тупо программиста. Это и было (если верить мелкософт-овцам) смыслом дотнета — этакая прослойка между языками. IRL схему ждал былинный отказ: если одна часть проекта на C#, а вторая на IronPython, то приходится держать в команде минимум одного шарписта и минимум одного обгвидка, потому что код друг друга они не понимают и при необходимости малейшего баг-фикса или модернизации, в лучшем случае, придётся перепедалить всё заново (в худшем пофиксят так, что потом всё равно придётся).
Свободная кроссплатформенная реализация данного C# и .NET. Главный разработчик — Мигель де Иказа, до этого прославившийся как один из разработчиков Gnome. Сейчас уже реализована поддержка .NET 4.5 (кроме, разве что, OLE).
Эта среда породила немало специальных олимпиад, в частности, на ЛОРе. Срачи обострились после призыва одного полоумного бомжа отказаться от C# для разработки свободных приложений, поскольку патенты на данный язык принадлежат Microsoft (что конечно же не совсем так, ибо C# и CLR являются стандартами ECMA-334/335, что и позволяет свободно запилить свой фреймворк (как например тот же Mono) с сами знаете чем). Устные обещания не предъявлять по ним претензии бомжа также не устроили, так как, по его, бомжа, мнению, они — филькина грамота.
Аргументы сторонников моно и Мигелюшки следующие:
Позже Столлман назвал Мигеля предателем сообщества за то, что тот интегрирует Mono в Gnome, а также за другие не очень хорошие дела, например, за сотрудничество с MS с целью переноса свободных программ на Windows. В ответ Мигель заметил, что Господь любит всех живых существ, даже Столлмана. Вообще весь .NET является причиной попоболи всех красноглазых, поскольку уже сам факт его существования часто становится доказательством того что линукс не нужен не только на десктопе, но и на сервере (никто ведь не будет запускать серьезный проект под Mono). Множество успешных проектов на ASP.NET и вебсервисов тому доказательство.
Переименовались в Xamarin и коммерциализировалось: инди-лицензия на Xamarin.Android (который раньше был MonoDroid) или Xamarin.iOS (MonoTouch) стоит $300 в год. За всё вместе — $540. Для компаний каждая обойдётся в целый килобакс. Вот вам и свободная реализация. Впрочем остальные реализации по-прежнему бесплатные, что позволяет невозбранно писать на C# под Gnome или Windows. Правда студенты могут бесплатно получить Xamarin.Android и Xamarin.iOS тут
24 февраля 2016 года Xamarin был с потрохами куплен мелкомягкими и стал бесплатным для разработчиков небольших компаний пруф.
Мультиплатформенный игровой движок, который работает везде. То есть вообще везде: совместим с Windows, Linux, OS X, Android, iOS, Wii, PlayStation 3, Xbox 360 и даже в браузере запускается (с помощью специального модуля). Разрабатывался тремя школьниками, которые хотели написать игру, но не могли договориться какую. В итоге решили сначала написать движок с инструментарием и всё заверте… В общем, пацаны пришли к успеху. На данный момент — один из основных конкурентов Unreal Engine и наиболее перспективное направление для начинающего игродела.
Хорош он не только мультиплатформенностью, но и мощной средой разработки, которая позволяет запускать игру прямо в редакторе, а также широкой поддержкой различных форматов. Но самое главное — язык скриптов, которым и является сабж. В то время, как на большинстве комерческих движков приходится использовать или C++, или встроенные языки, типа богомерзкого UnrealScript, Unity3D предлагает кодить на тёплом ламповом Шарпе (а также диалектах js и Питона). В серьёзном бизнесе пока что непопулярен (ибо всё ещё выдаёт картинку похуже конкурентов), но большинство перспективных кикстартеских проектов делают именно на нём (в том числе Wasteland 2 и Torments Tides of Numenera).
Примечательно, что сам движок пишется на C и C++.
Одна из основных дисциплин специальной олимпиады быдлокодеров (потому что для настоящего программиста язык вторичен). Цимес в том, что Жаба и Шарп — аналоги да ещё со схожим синтаксисом. Казалось бы, живи и радуйся, но нет, сотни быдлокодеров тратят сотни рабочих человеко-часов, доказывая друг другу, чья прелесть прелестнее.
Когда Шарп только вышел, это была покоцанная Жаба с несколькими С++ фичами и парой фреймворков, которые вчистую сливали аналогам. Кросплатформенность оказалась весьма условной (то есть весь код — Windows only). Жабаисты и дельфяры напророчили шарпокапец и успокоились. А зря, ибо вторая версия Шарпа нагнула Жабу по возможностям, и даже ASP.NET наконец-то стал генерить веб-странички вменяемых размеров. Но настоящая драма развернулась после выхода третьей версии. Внезапно появился LINQ, который многократно упростил обработку данных, а также WPF/WCF/MVC. Пощипывание пониже спины выросло в жгучую попаболь, и быдлокодеры кинулись на баррикады: жабаисты доказывать (прежде всего самим себе), что шарп не нужен, а шарписты — наоборот. Ситуация ещё больше усугубилась с выходом 4 версии Шарпа, в которой многопоточное программирование стало детской забавой, а в 5-й версии async и await заставили брызгать испаряющейся кислотой.
Основной аргумент шарпистов:
А у нас <del>в квартире газ</del> LINQ, TPL, свойства, лямбды, замыкания и ещё куча ништяков, а у вас?
"Ответ: Не нужно."
Весьма примечательно, что джаваисты объявляют ненужным абсолютно всё ровно до того момента, пока в Джаве это таки не появляется. После этого фича внезапно становится нужной и полезной. При этом, у Джаваистов принято люто фапать на Scala, которая состоит из вышеперечисленных ништяков чуть более, чем на половину.
Основной аргумент джаваистов:
А у нас полная кроссплатформенность, а у вас?
"Ответ 1: а у нас Моно."
Моно всё-таки имеет ограничения, да и выходит с опозданиями. Хотя в последнее время его начинают довольно активно использовать в Ынтерпрайзе.
"Ответ 2:" Далеко не всем программам нужна кросплатформенность, особенно в энтерпрайзе. Да и любое кроссплафторменное решение страдает именно оттого, что вынуждено быть чересчур универсальным, вследствие чего многие выгодные особенности конкретной платформы часто приходится либо игнорировать, либо реализовывать дополнительные слои абстракций, чтобы эти особенности были доступны и на других платформах.
"Ответ 3:" Будет очень скоро, надо только подождать. И в 2016 дождались! Server Core теперь открытый и кроссплатформенный. Можно писать серверные приложения на C# под что угодно. Насчёт кроссплатформенных окошечек — это то ещё мучение даже на Java со свежайшим JavaFX.
"Ответ на ответ 1:" Mono не поддерживается Мелкософтом. В этом случае можно сделать троллфейс и объяснить оппоненту, чем славен Мигелюшка. Если до этого звучали упрёки в анальном рабстве у Мелкософта, то следует объявить, что жабаисты в анальном рабстве у Оракла, раз уж мусье не признаёт сторонних реализаций JVM.
"Ответ на ответ 2:" Mono не доверяют и использовать не будут. Любой .NET-кун, который не раз и не два попадал на моно проекты, сразу же скажет, что это хуита, но проверять никто не будет и доказать ничего нельзя.

Пример холивара
Внутрений .netовский холивар. В отличие от предыдущего, ведётся даже не быдлокодерами, а конченными хеллоуворлдщиками. Дело в том, что C# и VB.NET — это одно и то же. Да-да, мой юный падаван, возможности этих языков абсолютно одинаковы, и единственное различие между ними — синтаксис. В C# он C-подобный, а в VB.NET — Бэйсико-подобный. И всё. Таким образом, участники данной специальной олимпиады спорят о том, что круче: скобочки или энды.
Луговский подобные кадры охарактеризовал следующим образом:

О так-то. Если вы узнали, что ваш коллега участвует в подобном холиваре — бейте его талмудом Макконнелла по голове до просветления.
Исключение: в C# все-таки возможно напрямую работать с памятью (unsafe code) в обход CLR, что невозможно в VB.NET, хотя подобные свойства в языке используются чуть реже, чем никогда. Ну а ещё VB.NET case-insensitive по умолчанию — дань предкам, однако.
Исключение № 2: В С# по-умолчанию нет некоторых функций, которые есть в VB.Net. Например, IsNumeric(). Которая, однако, может быть вызвана добавлением в проект референса Microsoft.VisualBasic.
Исключение № 3: Синтаксис (и местами поведение — привет, VB.NET-ный автотайпкастинг!) того же LINQ отличаются, внезапно, не в пользу C#. Однако небыдлокодерам похуй — они давно пишут LINQ-запросы соответствующими методами, предсказуемо смотря на литеральный LINQ, как на сами знаете что.
Суть: и VB.NET, и C# в итоге компилируются в IL, и виртуальная машина оперирует IL инструкциями, CLR знать не знает ничего, ни о C#, ни о VB.NET (о них знают только компиляторы), и из этого вытекают отличия языков — какую фишку CLR добавили в язык (все .NET языки должны поддерживать CLS, но возможности CLR шире, можно вообще используя грязные хаки и Mono.Cecil нагенерить сборку с тем, что ни в одном языке не разрешено, но разрешено в CLR). Обычно все новое вначале добавляют в C#, а позже в VB.NET, но иногда, бывает и наоборот. Пример: конструкция catch when в VB.NET, которую таки добавят в C# 6
Один из самых невменяемых быдлокодерских холиваров. Дело в том, что C# популярен в виде бэкэнда для веба. И хотя он, в отличие от РНР, может использоваться и для десктопа (WinForms, WPF), и для мобайла (Modern, Xamarin) и даже для геймдева (XNA, Unity3D), бо́льшая часть .net вакансий — ASP.net. Ну и как следствие, ASP.net занимает второе место среди серверных технологий. И это только в общедоступном интернете, а в Ынтерпрайзе доля стремится процентам к сорока (остальное зохавано Жабой). Когда РНРетушки видят, что какие-то корпоративные шарпобляди делают сайты не хуже, за бо́льшую зарплату, да ещё и без привязки к домену, они испытывают лютейший баттхёрт и открывают на каком-нибудь SQL.ru или PHPClub.ru очередную тему «ASP.net не нужен». Туда обязательно набигаєт пара .net-кунов, и всё заверте…
Бо́льшая часть участников холивара отличается крайней некомпетентностью в обсираемой технологии. Ну, а хуле: если бы РНР-кодерок освоил ASP.net, он бы на нём и работал, а среднему дотнетчику не нужен РНР. В результате холивар часто мутирует в Windows vs Linux или Apache vs IIS. Разумеется, в целевой системе/сервере оппонента холиварщик тоже ничего не понимает. Иногда поциэнты даже не ленятся нагуглить какой-нибудь майндфак и потом используют его как главный аргумент в споре. Например, РНРишники очень любят рассказывать об ужасах ViewState, хотя в нормальном сайте он занимает от силы 10-20 кб, что компенсируется отсутствием повторных запросов к базе, причём он отключаемый, причём в ASP.net MVC или том же NancyFx его просто нет.
А на самом деле кодерки сравнивают МПХ с пальцем: РНР — динамически слабо и неявно типизированный перлоподобный язык для создания маленьких сайтов (о чём намекает расшифровка его названия: «Personal Home Page»), а C# — статически сильно и явно типизированный сиподобный язык для тырпрайза (о чём неоднократно говорили сами мелкософт-овцы). Не конкуренты они ни разу и общего у них ничего нет. Но всем как всегда.
Эпический тред про ненужность VB.NET и нужность C#