Привет, хабражитель! Ты когда-нибудь задумывался, почему C# такой особенный по сравнению с другими языками программирования? Если нет (и если да), то приготовься, потому что сейчас мы погрузимся в различия между C# и самыми популярными его языковыми "братьями": C++, Java, Python и JavaScript. Надеюсь, что это сравнение лучше поможет лучше понять роль и место C#, а также то, что это лучший язык в мире (шучу). Ладно, вперед к сравнениям!

C# vs. C++

1. Управление памятью

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

2. Синтаксис и простота

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

3. Зависимость от платформы

C++ является зависимым от платформы выполнения, что означает, что код, написанный для одной платформы, например, x32, уже может не работать на x64 без доработок и изменений. С другой стороны, C# основан на платформе .NET, которая обеспечивает совместимость между платформами, то есть выбирая C#, ты выбираешь возможность запуска своей программы в любой среде, будь то Windows, Linux или MacOS.

C# vs. Java

1. Производительность

Хотя и C# и Java работают на промежуточных средах исполнения (CLR и JavaVM соответственно), что может влиять на производительность, C# часто выходит вперед благодаря компилятору Just-In-Time (JIT), который может оптимизировать код во время выполнения. Более того, если вам нужна только одна какая-то функция в программе, компилятор даже не будет компилировать все остальные! То есть в оперативной памяти будут только те части программы, которые вам действительно нужны, а не вся программа целиком.

2. Особенности языка

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

3. Language Integrated Query

У C# есть одно не совсем честное преимущество, потому что по факту, используя C# вы получает сразу два языка вместо одного. LINQ - встроенный язык запросов, который позволяет разработчикам писать код для работы с данными намного быстрее и проще. А в последних версиях языка за счет внутренних оптимизаций и хитрых хаков LINQ получил местами огромное ускорение в работе.

C# vs. Python

1. Скорость

Python известен своей читаемостью и простотой использования, что делает его популярным выбором среди новичков. Однако в плане чистой производительности C# часто оказывается впереди. Как компилируемый язык, C# обычно работает быстрее, чем Python, который является интерпретируемым языком. Говоря гоночными терминами, C# - это спортивный автомобиль, а Python - уютный семейный седан.

2. Типы приложений

C# более универсален в отношении типов приложений, включая разработку настольных, веб- и мобильных приложений. Python, с другой стороны, преуспевает в области науки о данных, искусственного интеллекта. Однако, основные библиотеки для работы с ИИ уже давно портированы на C#, а Майкрософт даже выпустила в общее пользование часть своих наработок по работе с искуственным интелектом в библиотеке под названием ML.NET.

3. Синтаксис

Синтаксис Python легко читается и понимается, что делает его дружелюбным для новичков. Однако, эта простота скрывает под собой непредсказуемое порой поведение, например, переменная cat может в один момент работы содержать в себе объект класса Кошка, а в другой момент число 42, в следующий - строку "Привет, читатель статьи!". Соответственно, в момент, когда мы обращаемся к переменной cat, у нас нет никакого понимания и гарантий что внутри действительно объект класса Кошка. C#, хотя и чуть-чуть сложнее, но намного стабильнее в процессе работы.

C# vs. JavaScript

1. Система типов

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

2. Среда выполнения

Хотя C# универсален и используется для различных приложений, он прежде всего известен своими возможностями в разработке серверных приложений. JavaScript, с другой стороны, используется в основном для разработки на стороне клиента в веб-разработке.

3. Асинхронное программирование

Как C#, так и JavaScript поддерживают асинхронное программирование, но C# выигрывает благодаря ключевым словам async и await, которые упрощают процесс написания асинхронного кода. Промисы JavaScript и синтаксис async/await справляются с задачей, но C# делает это проще, позволяя избежать "ада колбэков" и поддерживать чистоту и управляемость кода.

Заключение

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

Комментарии (40)


  1. NeoCode
    00.00.0000 00:00

    Ну если обобщать, то это касается не только C#. Другие современные высокоуровневые компилируемые языки со статической типизацией, такие как Go и Swift, также обладают этими преимуществами - как перед более низкоуровневыми С/С++, так и перед интерпретируемыми динамическими JS/Python.


    1. VladimirFarshatov
      00.00.0000 00:00
      +2

      Постоянно удивляет как народ смешивает не смешиваемое в одном предложении, что автор поставив несравнимое в сравнения, что комментаторы и очень часто и не только тут.

      Кстати, почему нет сравнения C# vs Haskel или C# vs Lisp? по статье и аргументам, кмк "самое оно" было бы. Ещё надо было с Visual Basic сравнить. Я понимаю ещё сравнить C# c Java .. оба языка имеют прослойку, за счет которой машинно-независимы, но гарантированно теряют в скорости, оба имеют JIT компиляцию. Но сравнивать с Питоном или Джаваскриптом, особенно с последним, где-то за гранью моего понимания. Питон - чистый интерпретатор как и PHP, имеет совсем имые преимущества, не достижимые в компилируемых языках от слова "теоретически", за которые надо платить скоростью.

      Javascript - вообще уникален, ибо это язык "на словаре". Вполне нормально имитирует как процедурные, так и функциональные языки и также является интерпретатором. За это плата всё та же самая - скорость исполнения.

      Параллелизм исполнения .. есть два подхода: "семафорный" и "хоаровский". Первый реализован в большинстве ОС, второй в Ада, Go и не помню, где-то ещё.. какой применен в C#? Автор про это умолчал, однако..

      Как можно сравнивать несравнимое?!? Сорри за много букв, может в чем и не прав, не настаиваю. Категорически режет глаз соединение в одном предложении совершенно разнородных вещей.. мягкое с теплым.


      1. Samhuawei
        00.00.0000 00:00

        Что вы все к скорости придрались. Можно подумать на ардуинах дум запускаете. Современные процессоры смолотят любой код. Да и в целом скорее всего этот код будет распределён на кластерах в облаке и работает ли он в два или в полтора раза быстрее никакой погоды не сделает.

        Да, есть узкоспециализированные задачи которые требуют выжать всё из железа. Но там речь не о языке программирования, а об использовании специальных библиотек производителя процессора или видеокарты. Которые вполне себе портируются под любой язык было бы желание.


        1. VladimirFarshatov
          00.00.0000 00:00
          +5

          "Придирка" не к скорости, а к непониманию различий между "теплым" и "мягким" и сваливании в одну кучу совершенно разнородных языков, имеющих свои, конкретные преимущества.

          Про скорость, замечу только одно: да, мощность компьютеров возросла на порядки со времен моей первой ЭВМ МИНСК-222М с её 6(шестью!) килословами ОЗУ и 8-и терминальном классе на Фортране-2 Ершова П.П. в НГУ в 1979г.. но!

          Отчего многократно возросшая моща компьютерной техники открывает страницу онлайн-службы какого-нибудь банка по 10-30-60секунд(!!!) как только выезжаешь "в деревню"? Может в консерватории что-то не так, и утверждение "Современные процессоры смолотят любой код" банально не верное в своей основе?


          1. Samhuawei
            00.00.0000 00:00

            Если программа плохо работает в местах с медленными интернет соединениями то это проблема не языка программирования, а выбранной архитектуры. Или даже так - перед разработчиками не ставили задачу работы под 2G, а тестировщики не тесировали, потому что клиентов в деревне мало и нет смысла тратить ресурсы.


      1. Lexo Автор
        00.00.0000 00:00

        почему нет сравнения C# vs Haskel или C# vs Lisp?

        Потому что это статья, ориентированная на тех, кто только выбирает на чём ему программировать и становиться ли программистом вообще. Предлагать кому-то начинать "вход в АйТи" с Хаскеля или Лиспа можно только если вам этот человек чем-то насолил и сильно не нравится.

        А если посмотреть банальный TIOBE index, то в топе будут как раз Python, C, C++, Java, VisualBasic (но, опять же, судя по количеству и зарплатах вакансий на HH не вижу смысла его изучать) и C#.

        Так что, да, во-первых, сравнение шло только с самыми популярными языками, которые могут быть на слуху у не-программистов. Во-вторых, попрошу обратить внимание, что, во-первых, статья написана для новичков (уровень "Простой"), поэтому прошу не залезать в области параллелизмом исполнения, Ады и прочего, кажется, здесь это не совсем уместно. В-третьих, у статьи стоит тег "Мнение". Если сами захотите написать статью по разнице параллелизмов исполнения в разных языках и какой из них на ваш счет лучше, то я вам только плюсик поставлю.


        1. VladimirFarshatov
          00.00.0000 00:00

          Потому что это статья, ориентированная на тех, кто только выбирает на
          чём ему программировать и становиться ли программистом вообще.

          В каком месте статьи это акцентировано? Не нашел. Обращение ко всем "хабражителям" и только.

          А если посмотреть банальный TIOBE index ... Так что, да, во-первых, сравнение шло только с самыми популярными языками, которые могут быть на слуху у не-программистов.

          Ну .. если посмотреть, то основное сейчас - веб-разработка, а там в лидерах PHP, которого у Вас тоже нет в сравнении. И PHP8 - уже вполне "приличный" язык, да и по скоростным параметрам уже вполне на уровне.

          В-третьих, у статьи стоит тег "Мнение".

          Ну так и высказал свое мнение, что мне странно читать сравнения теплого с мягким. Собственно, из-за разного назначения, такие разные языки и находятся в топах рядом друг с другом.


  1. Myxach
    00.00.0000 00:00
    +1

    C++ является зависимым от платформы выполнения, что означает, что код, написанный для одной платформы, например, x32, уже может не работать на x64 без доработок и изменений. 

    Уже интересно, а как же куча legacy приложение работают, хотя может от ос зависит. На винде таких проблем нет


    1. AlexSteelax
      00.00.0000 00:00

      Благодаря слою совместимости, который транслирует вызовы x32 в x64. Т.е. на x32 системе 64-приложения работать не будут, обратное возможно и зависит от ОС.

      https://learn.microsoft.com/en-us/dotnet/framework/64-bit-apps


    1. Samhuawei
      00.00.0000 00:00
      +3

      Да и в целом автор с трудом понимает что такое код, а что - исполняемый файл.Сама по себе стандартная библиотека вполне себе совместима со всеми процессорами и нужно просто указать определённый флаг для компилятора чтобы без проблем создать бинарник под нужную платформу. Да, если используются низкоуровневые структуры данных с выравниванием по границам слова и прочими делами придётся заморочиться. Но для 99% программ перекомпиляция под другую платформу не потребует никаких изменений в коде, только в makefile.


  1. alexei_ovsyannikov
    00.00.0000 00:00

    У меня возник вопрос, почему статическая типизация в C# приводит к меньшему количеству ошибок по сравнению с динамической типизацией в JavaScript? Ведь для JS уже придумали TS, который решает эту проблему.


    1. dopusteam
      00.00.0000 00:00

      Потому что типизация разная: в c# номинальная типизация, а в ts - структурная. К примеру, в js в runtime нет интерфейсов, а в c# - есть.


  1. AndronNSK
    00.00.0000 00:00
    +9

    Правильнее будет так

    C# же был разработан с прицелом на простоту...

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

    это моё имхо.


    1. DistortNeo
      00.00.0000 00:00
      +2

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


      1. AndronNSK
        00.00.0000 00:00
        +2

        Откровенно говоря, код на 20х плюсах я тоже не пойму, не занимаясь изучением их. Хотя я вроде C++ разработчик.

        Так что да.


        1. Samhuawei
          00.00.0000 00:00

          99% не понимают как устроен лазер. Тем не менее оптоволокном все пользуются.

          Многое из того что внесли в С++ упрощает разработку. Но язык устроен так что старое никуда не делось и можно преспокойно проигнорить новые фичи если код старый и переписывать неохота или нет ресурсов.


          1. Free_ze
            00.00.0000 00:00
            +1

            можно преспокойно проигнорить новые фичи

            Непонятно лишь, как игнорировать код, который нужно поддерживать.


  1. Samhuawei
    00.00.0000 00:00

    Cоответственно, в момент, когда мы обращаемся к переменной cat, у нас нет никакого понимания и гарантий что внутри действительно объект класса Кошка.

    У вас нет, у нас есть функция type


    1. Samhuawei
      00.00.0000 00:00

      Пояснительную бригаду прошу. Кому не нравится type в питоне?


    1. karim-kamaletdinov
      00.00.0000 00:00

      И type annotations


    1. Lexo Автор
      00.00.0000 00:00

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

      Страшнее дело обстоит, на мой взгляд, только в Objective-C, где ты можешь создать объект класса Кошка, а потом в реалтайме удалить у неё методы Мяукать() и Прыгать(), добавить методы ДышатьПодВодой() и Плавать(), однако, у тебя всё равно будет объект класса Кошка.

      В C# же ни первой, ни второй ситуации не бывает.


  1. AnarchyMob
    00.00.0000 00:00
    +2

    Хотя и C# и Java работают на промежуточных средах исполнения (CLR и JavaVM соответственно), что может влиять на производительность, C# часто выходит вперед благодаря компилятору Just-In-Time (JIT), который может оптимизировать код во время выполнения. Более того, если вам нужна только одна какая-то функция в программе, компилятор даже не будет компилировать все остальные! То есть в оперативной памяти будут только те части программы, которые вам действительно нужны, а не вся программа целиком.

    То есть вы хотите этим сказать что в jvm нет jit компиляции? Это когда же из jvm успели выпилить jit???


    1. PuerteMuerte
      00.00.0000 00:00
      +6

      Ну, jit-компиляция в jvm появилась относительно недавно, в конце прошлого века, автор мог ещё про это не знать.


  1. Vasjen
    00.00.0000 00:00
    +5

    Otus держит уровень. Только недавно была умопомрачительная статья про безопасность ASP. NET, а тут уже новая статья подъехала. Ждём статью про особенности разработки в разных операционных системах, где будет рассказ, что для отладки в окнах можно использовать командную строку, а в Линуксе терминал. И что дисков нет, и файловая система не NTFS.


    1. Lexo Автор
      00.00.0000 00:00

      Только недавно была умопомрачительная статья про безопасность ASP. NET

      Ох, спасибо вам, посмеялся. Хотя на самом деле хочется и плакать с того, как обстоят у нас дела. Как человек, который в теме, вы можете проявить инициативу и помочь ОТУСу со статьями, если хотите, конечно.

      для отладки в окнах можно использовать командную строку, а в Линуксе терминал

      Как человек, который интереса ради прожил полгода в командной строке, не удивлюсь, что и такое возможно. Ведь я тогда и аськой, и браузером (Lynx), и даже фильмы смотрел в консоли. Правда их приходилось сначала сконвертировать в разноцветные ASCII-символы, но ведь возможно. Так же и отладку окон можно как-то в консоль прикрутить.

      И что дисков нет

      А дисков уже и нет, есть ячейки.

      и файловая система не NTFS

      А вот тут уже не понял, файловая система может быть любой. Причём тут NTFS? Если уж высмеивать старомодность, то я бы FAT-32 или хотя бы FAT-16 посоветовал. Это примерно из тех же времён, что WinForms.

      И ещё не понял, в чём именно вам не угодила моя статья. Или это тоже "мнение", как и статья? "Не понравилось"?


      1. Vasjen
        00.00.0000 00:00
        +1

        Ведь я тогда и аськой, и браузером (Lynx), и даже фильмы смотрел в консоли.

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

        И ещё не понял, в чём именно вам не угодила моя статья.

        Вы рассказываете про слишком элементарные и поверхностные вещи для технического портала. Все равно, что писать статью про отличие айфонов от другим, рассказывая про лайтнинг и невозможность установки внешних приложений, к примеру. Слишком очевидно для хабра. Добавляем к этому, что вы публикуетесь под шапкой Отуса со слоганом "цифровые навыки от ведущих экспертов".

        Не то, чтобы я не считаю лично Вас экспертом, ни в коем случае - я и сам начинающий только, если что. Я понимаю что у Вас есть ЦА - те, кто придут на курсы, и для них возможно по содержанию это отличная статья, но это и не мешало в статье копнуть чуть глубже и раскрыть детали. Например про тот же сборщик мусора, не просто, что он есть, а как он работает, хотя бы в общем виде про поколения объектов, IDisposable и object.Finalize().


        1. Lexo Автор
          00.00.0000 00:00

          Подозреваю, что здесь та же проблема, что и с тегом "перевод". В первое время этот тег на хабре никто не видел и многие по делу и нет наезжали на переводчика, будто он автор, а иногда и даже ругали, что не указал, что это перевод, хотя он указал.

          Сейчас история с тегом "Сложность". У меня стоит уровень "Простой".

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

          Так-то, конечно, я могу и про finalization queue, но это, скорее будет тема для другой статьи. Для уровня "средний" или "сложный", в зависимости от глубины.

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


          1. VladimirFarshatov
            00.00.0000 00:00
            +1

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


  1. UndefinedRef
    00.00.0000 00:00
    +3

    В главе C# vs Python в секции 3 "Синтаксис" ничего не сказано про синтаксис, кроме того, что он легче понимается и читается, что спорно. Весь остальной текст в этом пункте уделён типизации, да и в целом не специфичной проблемы для Python (я бы даже сказал, что этой проблемой больше страдают js, php и т.п.)

    P.S.
    Почему спорно? Потому что ООП на Python выглядит чисто визуально устрашающе.


    1. Samhuawei
      00.00.0000 00:00

      Что именно вас пугает в ООП на Python? Раскройте тезис пожалуйста. По мне так нет ничего проще и понятнее.


      1. MDiMaI666
        00.00.0000 00:00

        таскать self удобно? и куча инициализаторов конструкторов


      1. lgorSL
        00.00.0000 00:00
        +4

        1. В питоне утинация типизация и не используют интерфейсы. Да они и бесполезны, т.к. перегрузка абстрактного метода будет выглядеть просто как объявление такого же метода с новыми аргументами.

        2. В питоне есть abc для абстрактных методов, но не понятно когда надо (и надо ли) его использовать

        3. Дженерики вроде бы и есть, но как-то очень криво сделаны и почти не используются. Ковариантность и контрвариантность типов - не, не слышали.

        4. Возможно множественное наследование, включая ромбовидное.

        5. У класса единственный конструктор, что в сочетании с множественным наследованием вообще не понятно как использовать. Допустим, наследуемся от классов А и Б, причём А хочет в конструктор аргумент "а", а Б - аргумент "б". Как их оба инициализировать?

        6. Не понятно, как при множественном наследовании разрешается совпадение имён полей. Я смутно помню, что можно дать полю имя с двойным подчёркиванием типа "__a" и тогда вроде бы будет независимых две переменных с одинаковыми именами - для кждого подкласса своя. Но, блин, с этим просто не хочется связываться. Вдобавок я могу использовать посторонние классы, код которых не получится изменить.

        7. Можно сделать проперти у объекта, можно сделать статический метод класса, но нельзя сделать статический проперти класса.

        8. Часть функционала ООП (типа модуля abc и property) делается через декораторы. Во-первых это ещё один механизм, который придётся понимать и учитывать. Во-вторых если декораторов несколько - не понятно, в каком порядке их писать. Иногда работает в любом, но никаких гарантий нет. Для примера, в обычных языках можно написать "public override final" или "final override public" и всё будет корректно.

        9. Модификаторов видимости нет. Есть только соглашение, что то что начинается с подчёркивания - не надо использовать снаружи.

        10. Можно написать код типа "if cond: class A() ... else class A() ..." и в зависимости от условия получить либо одно объявление класса, либо другое. Ещё можно случайно определить класс с тем же именем.

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


  1. x2v0
    00.00.0000 00:00

    Удивительно, что автор не упомянул Kotlin!?
    потому что Kotlin и C# - близнецы-братья :)


    1. Myxach
      00.00.0000 00:00
      +1

      Kotlin и C# братья близнецы? Чего блин?


      1. zaiats_2k
        00.00.0000 00:00

        Как Шварцнеггер и Девито в одноименном фильме. ;)


    1. DistortNeo
      00.00.0000 00:00
      +1

      Скорее, C# и Java, с которой первый был слизан и улучшен.


      1. Samhuawei
        00.00.0000 00:00
        +1

        А java в свою очередь слизана с C++ откуда удалили множественное наследование, шаблоны и работу с памятью.


        1. Lexo Автор
          00.00.0000 00:00

          Не уверен, что полностью соглашусь. Всегда считал истиной что-то вот такое:

          (С) https://www.decodejava.com/introduction-to-csharp-language.htm


      1. Lexo Автор
        00.00.0000 00:00

        Согласен. И это сравнение в статье уже есть.


  1. klimkinMD
    00.00.0000 00:00

    Учитывая, что это РЕКЛАМА курса, обсуждать тут нечего, ну кто, всерьёз, обсуждает рекламу?