По каким причинам я должен выбрать C # вместо Java и C ++? [закрыто]


46

C # кажется популярным в наши дни. Я слышал, что синтаксически это почти так же, как Java. Java и C ++ существуют уже давно. По каким причинам я должен выбрать C # вместо Java и C ++?


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

Позвольте мне добавить несколько более острых предметов. .NET имеет четко определенный DOM ( например, CodeDOM ) для своего языка, и, следовательно, динамическое создание объектов во время выполнения намного проще и эффективнее. Это также может быть полезным в качестве инфраструктурной возможности. Кроме того, система типов имеет соответствие 1-к-1 со всеми собственными типами W3. По своей сути, W3 и другие взаимодействия были встроены в язык с самого начала. Для других языков эти проблемы были просто закреплены и представляют для них много проблем. Кроме того, если вы будете взаимодействовать с большим количеством языков и / или протоколов, то .NET также очень силен
JoeGeeky

5
Привет, JoeGeeky, добавь свой комментарий в качестве ответа на вопрос.
Энтони Мастреан

1
Реальные вопросы: по каким причинам я должен выбрать Nemerle, F * и F # вместо C #? (то есть все три языка от MS, и все три лучше)
mrsteve

Я действительно не думаю, что какое-либо утверждение жанра «язык / платформа X по сравнению с языком / платформой Y ВСЕГДА лучше» справедливо, и я также думаю, что для любых X и Y его можно легко сделать недействительным для определенных контекстов. Какой смысл в этом вопросе?
Шиван Дракон

Ответы:


76

Вопрос должен звучать так: «Какой язык лучше подходит для современной типичной разработки приложений?».

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

Так что, не в моей голове (некоторые аргументы применимы к обоим языкам) ...

C # лучше C ++ в этом:

  • У него есть собственная сборка мусора.
  • Это позволяет вам рассматривать сигнатуры методов класса как свободные функции (т.е. игнорировать thisаргумент указателя со статической типизацией ) и, следовательно, создавать более динамичные и гибкие отношения между классами. измените, если вы не знаете, что это значит, затем попробуйте назначить метод-член, возвращающий void и принимающий void для void (*ptr)()переменной. Делегаты C # имеют при себе thisуказатель, но пользователь не всегда должен заботиться об этом. Они могут просто назначить void()метод любого класса любому другому void()делегату.
  • Он имеет огромную стандартную библиотеку с таким количеством полезных вещей, которые хорошо реализованы и просты в использовании.
  • Он учитывает как управляемые, так и собственные блоки кода.
  • Сборка версий легко решает проблемы с адом DLL.
  • Вы можете установить классы, методы и поля как внутренние сборки (что означает, что они доступны из любой точки DLL, в которой они объявлены, но не из других сборок).

C # лучше чем Java в этом:

  • Вместо большого шума (EJB, реализации частных статических классов и т. Д.) Вы получаете элегантные и дружественные нативные конструкции, такие как Properties и Events.
  • У вас есть настоящие дженерики (а не дурацкая шутка, которую Java называет дженериками), и вы можете поразмышлять над ними.
  • Он поддерживает идиомы нативного управления ресурсами ( usingутверждение). Java 7 также будет поддерживать это, но в C # это продлилось гораздо дольше.
  • Он не проверил исключение :) (спорно ли это хорошо или плохо)
  • Он глубоко интегрирован с Windows, если вы этого хотите.
  • Он имеет Lambdas и LINQ, поэтому поддерживает небольшое количество функционального программирования.
  • Это позволяет явно использовать как общую ковариацию, так и контравариантность.
  • Он имеет динамические переменные, если вы хотите их.
  • Лучшая поддержка перечисления, с yieldутверждением.
  • Это позволяет вам определять новые значения (или не ссылочные) типы.

Редактировать - Адресация комментариев

  • Я не говорил, что C ++ не поддерживает родной RAII. Я сказал, что в Java его нет (вы должны явно сделать попытку / наконец-то). В C ++ есть автоматические указатели, которые отлично подходят для RAII и (если вы знаете, что делаете) также могут заменить сборщик мусора.
  • Я ничего не говорил об эмуляции свободных функций. Но, например, если вам нужно получить доступ к полю с помощью thisуказателя и связать метод, который делает это, с указателем обобщенной функции (т. Е. Не в том же классе), то просто не существует собственного способа сделать это. В C # вы получаете бесплатно. Вам даже не нужно знать, как это работает.
  • Под «обработкой методов-членов как свободных функций» я имел в виду, что вы, например, не можете, собственно, связать метод-член с сигнатурой свободной функции, поскольку методу-члену «тайно» нужен thisуказатель.
  • usingУтверждение, очевидно , наряду с IDisposable оберток, является отличным примером RAII. Смотрите эту ссылку . Учтите, что вам не нужен RAII так сильно в C #, как в C ++, потому что у вас есть GC. Если вам это нужно, вы можете явно использовать это usingутверждение. Еще одно маленькое напоминание: освобождение памяти - дорогостоящая процедура. GC имеют преимущество в производительности во многих случаях (особенно когда у вас много памяти). Память не протечет, и вы не будете тратить много времени на освобождение. Более того, распределение также происходит быстрее, поскольку вы не выделяете память каждый раз, только время от времени. Вызов newпросто увеличивает указатель на последний объект.
  • «C # хуже в том, что у него есть сборка мусора». Это действительно субъективно, но, как я уже говорил выше, для большинства современных типичных приложений сборка мусора - это чертовское преимущество.
    В C ++ вы можете либо вручную управлять вашей памятью с помощью newи delete, что эмпирически всегда приводит к ошибкам здесь и там, либо (с C ++ 11) вы можете использовать авто указатели изначально, но имейте в виду, что они добавляют много и много шума в коде. Так что у GC все еще есть преимущество.
  • «Дженерики намного слабее шаблонов» - я просто не знаю, откуда вы это взяли. У шаблонов могут быть свои преимущества, но по моему опыту ограничения, общая проверка типов параметров, контравариантность и ковариация являются гораздо более сильными и элегантными инструментами. Преимущество шаблонов в том, что они позволяют немного поиграть с языком, что может быть круто, но также вызывает много головной боли, когда вы хотите что-то отладить. В общем, шаблоны имеют свои приятные функции, но я считаю, что дженерики более практичны и чисты.

5
И если вам все еще нужен сборщик мусора для C ++, вы можете скачать его .
fredoverflow


6
Другая важная особенность C # по сравнению с Java по соображениям производительности - это «структура», тип объекта, который может храниться в стеке (или в регистрах ЦП, в особых случаях) или встраиваться в другие объекты кучи. Они часто используются для небольших объектов с 1-4 полями, таких как пары координат X, Y.
Qwertie

2
@LokiAstari Разум объясняет? Пока вы не забудете отменить регистрацию обработчиков событий и использовать шаблон Dispose для классов, которые содержат нативные оболочки, все будет в порядке. Это гораздо меньше, чтобы знать и помнить, чем управление памятью в C ++.
Ям Маркович

2
-1, так как мне не хватает разделов «C ++ лучше, чем C # в этом ...» и «Java лучше, чем C # ...». Я не думаю, что C # превосходит во всех областях, поэтому ответ без этих двух разделов, вероятно, не хватает какой-то важной информации.
Джорджио

30

Окружение

Клиенты .NET Framework и Windows

Windows является доминирующей операционной системой на клиентских компьютерах. Лучшие графические среды для приложений Windows - это Winforms и WPF вместе с .NET Framework . Лучший язык программирования для работы с .NET Framework и его API - это C # . Ява не является альтернативой для этого. А C ++ - более старый язык без автоматического управления памятью. C # похож на C ++, но имеет автоматическое управление памятью, и вам не нужно работать с указателями, которые повышают производительность. C ++ все еще может быть лучшим вариантом для некоторых случаев, но не для приложений с интенсивными формами баз данных, которые распространены в бизнесе.

IIS и Windows Server

Если вы привыкли работать в среде Windows и с C #, вам потребуются наименьшие инвестиции для изучения IIS для программирования сервера и Windows Server для базового администрирования.

Active Directory и Windows Server

Если вы разрабатываете программное обеспечение, которое будет развернуто в сетях компании, вполне вероятно, что они используют среду, ориентированную на Windows, с использованием Windows Server с Active Directory. В такой среде проще интегрировать и развертывать решения, созданные на C # и .NET Framework .

Лично я разработчик Java, не разработчик C #, но я работаю с сетью. Я бы переключился на C #, если бы я разрабатывал сетевые приложения для сети Windows. Но я предпочитаю Java для веб-серверов на базе Linux. Я бы выбрал C ++ для встроенных систем, если бы у меня не было много зависимостей.

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

Резюме

Среда для вашего программного обеспечения является наиболее важной для выбора C # . Если вы работаете в среде с клиентами Windows, серверами Windows, Active Directory, IIS и, возможно, SQL Server, тогда C # - лучший язык для .NET Framework .

Если вы работаете в среде Unix, например, с веб-сервисами, я бы выбрал Java. И если вы работаете со встроенными системами или должны интегрироваться с аппаратными устройствами, C ++ будет хорошим выбором.


3
Абсолютно - вот почему я использую C #, на самом деле нет никакой другой причины
Murph

Конечно, вы можете использовать .NET на других платформах через Mono, MonoTouch и MonoDroid, но мои тесты показали, что Mono значительно медленнее, чем .NET для Windows, а собственная компактная платформа Microsoft очень медленная на Windows CE: codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ... конечно, WPF доступен только в Windows (но мне все равно это не нравится.)
Qwertie

Какие зависимости вы имеете в виду: «Я бы выбрал C ++ для встраиваемых систем, если бы у меня не было многих зависимостей». Вы имеете в виду библиотеки Java?
Puckl

@ Да, но в основном JVM / JRE.
Джонас

«Если вы работаете в среде Unix, например, с веб-сервисами», существуют другие языки и фреймворки, которые можно рассмотреть: ruby, Python, node.js и т. Д.
MarkJ

15

C # и Java

C # - очень хороший язык, если:

  • Вы хотите сделать объектно-ориентированную разработку общего назначения. Это классический, статически типизированный язык ООП.
  • Вы нацелены только на платформы Microsoft (стоит помнить, что Microsoft эффективно клонировала Java для создания C #, потому что они хотели Java-подобный язык, который запер бы людей в Windows. Они могли бы использовать Java, но это позволило бы людям легко запускать приложения на другие платформы ....)

C # как язык лучше, чем Java, по-разному (лучший синтаксис для свойств, типов значений, обобщенных обобщений и т. Д.). Я предпочитаю C # как язык Java, но по большому счету они довольно похожи и подходят для похожих приложений.

С другой стороны, у Java также есть некоторые большие преимущества:

  • Огромная экосистема с открытым исходным кодом - библиотеки для Java, которые вы можете получить бесплатно, безусловно, являются лучшими из всех языков. Трудно переоценить важность этого - с точки зрения достижения цели, Java очень эффективна.
  • Инструменты - инструменты Java, на мой взгляд, лучше, чем то, что вы можете получить в мире .Net. например, Maven (как только вы освоили его!) особенно впечатляет.
  • Поддерживаемость - Java уже давно существует и успешно работает в крупных компаниях именно потому, что она относительно стабильна и было приложено много усилий для обеспечения обратной совместимости. Простой и слегка многословный синтаксис также помогает Java здесь - легче читать и поддерживать код, если код очень ясный и явный
  • Новые языки. В JVM появилось несколько новых удивительных языков (Scala, Clojure, Groovy и т. Д.), Которые являются будущим платформы Java. Именно здесь происходит большая часть языковых инноваций, причем гораздо быстрее, чем в Java или C #.

Так что Java против C # - это довольно близкий вызов, и все зависит от того, хотите ли вы быть в лагере Microsoft или в Open Source / кроссплатформенном лагере.

Лично я предпочитаю Java, потому что:

  • На мой взгляд, библиотечная экосистема гораздо важнее того факта, что C # имеет более приятный синтаксис, чем Java
  • В долгосрочной перспективе я хочу, чтобы весь мой код был правильно кроссплатформенным и мог работать на больших кластерах дешевых машин linux в облаке.
  • Clojure, на мой взгляд, является самым многообещающим языком в мире на данный момент, и если я буду придерживаться платформы JVM, то со временем смогу легко перенести свой код и навыки в Clojure.

C / C ++

C / C ++ - это совершенно другой зверь. Я не рекомендовал бы это для разработки приложений общего назначения в настоящее время по следующим причинам:

  • Управление памятью - в настоящее время для большинства программ общего назначения вам не нужно управлять собственной памятью. Сборка мусора в C # или Java намного лучше для вашей производительности и здравомыслия, чем любой из явных методов управления памятью, которые вам придется использовать в C / C ++
  • Сложность - C ++, в частности, является чрезвычайно сложным языком. Освоение занимает много времени, и сам код также может быть очень сложным. (Шаблоны C ++, например, особенно волосатые ....)
  • Производительность - большую часть времени и при прочих равных условиях вам понадобится больше времени, чтобы добиться успеха в C / C ++.

Однако это, несомненно, отличный выбор для определенного ограниченного числа специальных доменов, в частности:

  • Операционные системы - вы, вероятно, хотите использовать C / C ++, если вы пишете операционную систему.
  • Разработка игр - почти все лучшие коммерческие игровые движки - это C / C ++. Это все еще лучший выбор, если вы разрабатываете требовательный заголовок AAA (C # и Java отлично подходят для менее требовательных / казуальных игр)
  • Высокопроизводительные вычисления - оптимизированный C / C ++, вероятно, является лучшим способом создания очень высокопроизводительного кода. Для большинства приложений такой уровень оптимизации не стоит усилий, но в определенных областях он может быть чрезвычайно ценным (например, торговля с высокой частотой)
  • Доступ к оборудованию - вам необходим прямой доступ к оборудованию (например, для встроенной системы)

Таким образом, в основном C / C ++ является отличным выбором, если и только если вы сосредоточены на одной из областей, где он особенно хорошо подходит.


1
Вы упоминаете Maven в качестве примера лучших инструментов для Java. Я не особо знаком с этим, но, глядя на документацию, Maven выглядит гораздо более похожим на собственный инструмент сборки .Net MSBuild. Что делает Maven лучше, чем MSBuild?
Кевин Кэткарт

1
+! (только потому, что у меня только один голос): вы очень хорошо объяснили, почему экосистема Java лучше и почему не следует сравнивать только синтаксис C # против Java. У Java все больше и больше библиотек и инструментов. В самом языке Java мало что происходит, но для JVM появляются новые очень интересные языки, которые (IMO) гораздо интереснее C #. Я не знаю Clojure, но нахожу Scala очень интересным: с самого начала он был разработан как OOP + FP.
Джорджио

2
почему все думают, что код C ++ полон ручного управления памятью. Это не C, вы знаете, RAII означает, что вам почти никогда не придется выделять / освобождать память вручную (в таких случаях такой язык, как C #, будет для вас бесполезен).
gbjbaanb

3
@gbjbaanb - вероятно, потому что RAII не подходит для общего управления памятью. Это никоим образом не эквивалентно по гибкости полной системе GC, как вы видите в Java или C #. Как только вы выходите за пределы RAII, вы возвращаетесь на территорию ручного управления памятью.
Микера

3
@mikera Просто хочу отметить, что на платформе .NET также довольно много языковых разработок. Например, F # - это удобный функциональный язык, который плавно интегрирует остальную часть .NET, а Python недавно был перенесен на .NET как Iron Python (и тоже получил хорошую IDE !).
Их

13
I heard that syntactically they are almost the same.

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

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

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


6
Я думаю, что нужно сравнить как языковые возможности, так и наличие языка на разных платформах. С C # один привязан к Microsoft, с Java - нет: это большое преимущество, по крайней мере для разработчиков UNIX / Linux. OOP + FP - это классная функция, но зачем беспокоиться о C #, если вы можете использовать Scala, которая работает на JVM и может взаимодействовать с унаследованным кодом Java? Я бы никогда не выучил язык для конкретной платформы, если бы не был вынужден.
Джорджио

2
@ Джорджио: Mono проект существует. Но, во-вторых, Microsoft на самом деле заботится о своей платформе - они регулярно обновляют ее. В Java почти ничего нового не было. Кроме того, вопрос касается C # против Java, а не CLR против JVM.
DeadMG

4
@DeadMG: Насколько я знаю, я не могу взять любую программу на C #, разработанную для Windows, и собрать ее с помощью Mono. Не CLR против JVM? Вопрос в том, почему люди используют C # или Java. Чтобы люди могли использовать язык, им нужны среда выполнения и операционная система. Я не обсуждаю тот факт, что в C # больше возможностей, чем в Java, но Java гораздо более переносима: это фактор, который может повлиять на принятие языка. На самом деле Java все еще используется гораздо чаще, чем C #, даже если в ней отсутствуют определенные расширенные функции.
Джорджио

3
@ Джорджио, вы можете взять любую программу на C # и собрать ее с помощью Mono. Вы не можете использовать определенные библиотеки (которые в любом случае не являются частью языка C #). И Java не "намного более портативен". Вы можете написать код для iOS на C #, но не на Java, например.
SK-logic

2
@Giogio, Mono, по крайней мере, такой же портативный, как JVM.
SK-logic

7

Ну, C#есть некоторые хорошие встроенные функции, такие как LINQи делегаты. Он получает лучшее из обоих миров - Javaи C++. Смотрите здесь для полного сравнения.

Но мне больше нравится Javaмир - гораздо больше фреймворков с открытым исходным кодом, и он работает на каждой платформе. И не говорите мне об этом Mono- это не надежный вариант.


9
+1: «Но мне больше нравится мир Java - гораздо больше фреймворков с открытым исходным кодом, и он работает на каждой платформе». Будем надеяться, что Oracle не изменит это!
Джорджио

15
Разум объяснил, что не "надежно" в Mono?
SK-logic

2
@Petar Minchev, это только твоя вина. Вы должны следовать рекомендациям по переносимости, и вы не должны использовать непереносимые библиотеки - и таким образом любое сложное приложение будет надежно работать с Mono. Такие вещи, как WPF никогда не будут портированы.
SK-logic

2
@Petar Minchev, есть много непереносимых библиотек Java. Вы всегда должны быть осторожны с переносимостью, независимо от того, какой язык вы используете. И вообще, вопрос касается языков, а не сторонних библиотек.
SK-logic

3
@Petar Minchev, GTK # является портативным. Используйте это вместо этого.
SK-logic

3

Согласно некоторым источникам (см., Например, http://www.indeed.com/jobtrends ), C # все еще менее популярен, чем Java, и столь же популярен, как C ++.

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

Лично я все еще предпочитаю миры Java / C ++. Как сказал Петар Минчев, в Java больше фреймворков и приложений с открытым исходным кодом, она работает везде, она менее привязана к конкретному поставщику и операционной системе. C ++ имеет аналогичные преимущества, даже несмотря на то, что код часто нуждается в адаптации, переходящей с одной платформы на другую. Поскольку я предпочитаю разрабатывать на Linux и, насколько мне известно, я не могу полностью освоить C # на Linux, я никогда не интересовался C #, потому что мои потребности в программировании покрываются C, C ++, Java, Scala.

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


«Я не могу полностью посвятить себя C # в Linux» - не могли бы вы уточнить это? Вы имеете в виду, что полная .Net Framework недоступна, потому что я не сталкивался с какими-либо проблемами с самим языком C # (или F # в этом отношении) в Linux?
Уэсли Вайзер

@wawa: Насколько мне известно, .Net Framework соответствует JDK, а .Net Framework доступен только для Windows, тогда как JDK доступен для нескольких ОС. Если это не правильно, я могу отредактировать свой ответ (и также изменить свое мнение).
Джорджио

1
Я думаю, что более близкой аналогией была бы библиотека базовых классов с JDK. BCL имеет стандартизированные и нестандартные детали. Моно-проект реализует как стандартизированные, так и многие нестандартные элементы.
Уэсли Мудрый

@wawa: Спасибо за информацию. Я рассматриваю возможность попробовать C # с использованием Mono. Тем не менее, у меня все еще есть довольно сильное ощущение, что C # гораздо сильнее привязан к Microsoft, чем Java к Oracle (или к Sun в прошлом).
Джорджио

3

А как насчет того, «Какая среда разработки программного обеспечения включает язык программирования»?

Вы забыли включить другие вещи, такие как «среда», с которой вы будете работать.

  1. Собираетесь ли вы работать только для ОС Windows, но не должны быть низкого уровня и иметь много памяти и других ресурсов?

    Выберите .NET в качестве основы для Windows и используйте C #.

  2. Собираетесь ли вы работать только для Windows, но не должны быть низкого уровня, НО, не имеет много ресурсов?

    Выберите Delphi Framework (и Object Pascal. Язык программирования Delphi или Lazarus Object Pascal. Язык программирования).

  3. Является ли ваше приложение. требуется поддержка нескольких платформ, таких как игра, на разных мобильных телефонах?

    Выберите Java Framework и язык программирования Java.

  4. Это Linux с KDE в качестве графического интерфейса?

    Выберите QT framework с C ++

  5. Это Linux с Gnome в качестве графического интерфейса?

    Выберите GObject / GLib framework с C ++

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

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

Просто мои 2 цента.


1
Я не уверен насчет 3. Смартфоны очень популярны сегодня и AFAIK, все они поддерживают C # в той или иной форме, но только Android поддерживает Java.
svick

Разве Дельфи не умерла? :)
Шлякер

@ šljaker Нет, но не очень популярные дни.
umlcat

1
@svick: Это ложь. Помимо Android, Java также существует в той или иной форме на iOS, Symbian, WinMo, Blackberry, Maemo и WebOS (т. Е. Все, что имеет значение или все еще имеет значение; не заставляйте меня начинать работу даже с небольшими платформами). Android, Blackberry и Symbian официально поддерживают Java как вариант разработки; Sun поддерживала Java на iOS, хотя Apple это не нравилось. Java является основным языком разработки в телефонах Android и Blackberry. Я не могу сказать то же самое с C #, AFAICT, это только официально поддерживается на WinMo.
Ли Райан

1

Если вы выполните поиск, вы, скорее всего, наткнетесь на обсуждение основных языков программирования. Вот один из результатов поиска - http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - Java по-прежнему кажется самым популярным языком.

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


1

Пара вещей, которые еще не были упомянуты:

C # лучше, чем C ++, потому что:

Это избавляет от заголовочных файлов, что означает большую простоту.

C # лучше, чем Java, потому что:

Он поддерживает определяемые пользователем типы ссылочного типа (класс) и тип значения (структура), которые, если вы знаете, что делаете, могут привести к значительному повышению производительности.

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


Можете ли вы объяснить, каким образом наличие типов ссылочного типа и типа значения может повысить производительность в C #?
Джорджио

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

В качестве другого примера, если вы хотите определить маленький новый тип (тип, который будет соответствовать машинному слову), вам не нужно определять новый класс для него; Вы можете просто сделать его структурой, поэтому он будет подчиняться семантике значений. Передача таких структур не будет более дорогой, чем передача ссылок на объекты, но вы будете иметь преимущество в том, что не будете выделять, создавать и собирать мусор каких-либо объектов.
Майк Накис

Я понимаю. Таким образом, классы создаются в куче и доступны через ссылки, в то время как структуры создаются в стеке (?)
Джорджио

Почти правильно. Единственная неточность в этом утверждении заключается в том, что структура будет найдена в куче, если она встроена в другой объект или если она находится внутри массива структур. И он также будет найден в куче, если он когда-либо будет упакован, точно так же, как типы значений упакованы в Java.
Майк Накис

1

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

Выберите C #, если вы работаете только в среде Microsoft. В то время как C # стандартизирован согласно ISO / IEC 23270: 2003, версия Microsoft остается единственной полной реализацией. Некоторые ключевые части языка не подпадают под действие стандарта и, следовательно, являются предметом патентов Microsoft. Никто другой не будет реализовывать полностью совместимую версию языка для других систем, поэтому, по сути, вы являетесь поставщиком, привязанным к Microsoft Windows и .Net, пока вы используете язык. Если вы ищете навыки для использования на рынке мобильной связи, лучше всего искать на другом языке.

Java работает, но имеет много накладных расходов, отчасти из-за таких функций, как сборка мусора. Java также не стандартизирована ISO / IEC, поэтому у вас нет никаких гарантий при переключении платформ и версий Java, только лучшие намерения Sun / Oracle. Если вы в конечном итоге планируете работать с Android, это, безусловно, путь. Программирование Android в основном Java, с некоторыми изменениями.

C ++ стандартизирован, и почти все компиляторы следуют международному стандарту, поэтому вы гарантированно себя ведете, НО язык не защищает вас от вас самих. Вы должны выполнить очистку и проверку переполнения самостоятельно. Это не сложно. Программисты C / C ++ занимаются этим уже много лет. Apple использует Objective C для всего, поэтому, если вы хотите стремиться к Apple, я рекомендую вам попробовать это.

Если вы когда-нибудь оставите Windows позади, я бы предложил изучить и C / C ++, и Java - и то, и другое сейчас доступно на рынке.


0

Что касается C ++ и C # (поскольку я недостаточно опытен в Java), то здесь мне не хватает возможности доступа к низкоуровневым ресурсам в Windows. Например, вы не можете разработать собственный драйвер дисплея в C # (пока), но вы можете это сделать с C ++. Это не делает C ++ лучше. Я вижу C ++ против C # как сборка против C.

На мой взгляд, C # гораздо эффективнее, если вы посмотрите на время, необходимое для реализации функции. Сокращение производительности среды выполнения .Net незначительно для 99% разработанных приложений. Это может иметь значение, если вы выполняете замкнутый цикл, да, во что бы то ни стало, но большую часть времени приложение бездействует, ожидая ввода любого типа, сигнала или прерывания (дисковый ввод-вывод, нажатие кнопки, сеть, завершение анимации) ,

Библиотека CLR со всеми его функциями имеет еще одно большое преимущество. Когда я обучал C # младшим разработчикам, большинство из них сказали, что им нравится соглашение о логическом именовании классов, членов и пространств имен. Поиск функции метода был логичен в SDK, в чем была серьезная ошибка Visual Basic 5. Это очень помогло им в принятии библиотеки. Изучив синтаксис языка, выучите новую библиотеку, чтобы получить хорошее представление о любом SDK. Это спасает вас от изобретения колеса.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.