Почему в C # гораздо больше возможностей, чем в Java? [закрыто]

14

Обратите внимание, что это не аргумент Java против C #. Я программист на Java без опыта C #, просто из любопытства.

Я немного читал на C #, и, похоже, в нем гораздо больше возможностей, чем в Java. Ряд примеров:

  • Тип вывода.
  • dynamic ключевое слово.
  • Делегаты.
  • Необязательные параметры.
  • Лямбда и LINQ (на самом деле я понятия не имею, что это).
  • Свойства.

Однако в Java нет ничего такого, чего нет у C #.

Мой вопрос: почему C # имеет гораздо больше нативных функций, чем Java? И почему Java не добавляла некоторые из них в течение многих лет, например, Свойства или вывод типа? Разработчики языка Java используют более упрощенный подход? Что является причиной этого?

Авив Кон
источник
2
@ Патрик - это особенность или детали реализации?
Пит
14
Пристрастный ответ: потому что команда разработчиков C # знает, что они делают. Более разумный ответ: C # был спроектирован с учетом ошибок Java и без догматического «только чистого ОО» (которое они даже не совсем ударили). Половина из этих функций была насыпными импортировано из Лиспа и Haskell, два языка Java стойко отказывался вдохновиться до Java 8, а остальные улучшения здравомыслия сделаны стали очевидным отсутствием в Java из них.
Фоши
4
Потому что C # появился позже и изначально был явным грабежом Java, а затем имел возможность добавить все, что оказалось полезным, в то время как Java сдерживался очень строгими целями обратной совместимости.
Килиан Фот
2
@ Clockwork-Muse, но C # имеет две реализации времени выполнения - CLR и Mono. Также есть Xamarin. Я не слышал ни об одном решении для создания кросс-проектов iOS / Android / WinPhone с использованием Java.
Ден
4
@KilianFoth: На самом деле C # изначально был пламенным плагием Delphi , переписанным так, чтобы выглядеть как Java. Microsoft даже оттолкнула архитектора проекта Delphi от Borland, чтобы создать его.
Мейсон Уилер

Ответы:

22

Некоторые причины:

  1. C # появился позже, чем Java; Версия 1 была явным плагиатом Java 1.4, так что в ней было почти все, что было в Java на тот момент.
  2. Но затем C # развивался намного быстрее, чем Java, потому что это была захватывающая новая платформа (и имел совершенно блестящий драйвер в Андерсе Хейлсберге, отце Turbo Pascal). Это позволило им избежать всех ошибок в Java, которые стали очевидными, и в то же время добавить все, что хотелось бы практикующим Java.
  3. Между тем Java сдерживался очень строгими целями обратной совместимости и несколько более медленными темпами развития, отчасти потому, что он отчаянно пытался завоевать репутацию стандартного, корпоративного, надежного, неудивительного решения для 95% не гениальных пользователей. программисты. В этом они преуспели, возможно, слишком хорошо.

В результате у Java теперь есть небольшой пробел в функциональности. У него большие планы на будущее, но, как обычно, с такими вещами все занимает немного больше времени, чем планировалось.

Килиан Фот
источник
7
Я не уверен, что согласен с этим. Я имею в виду, что все это правда, но я подозреваю, что причина в большей степени связана с политикой вокруг падения Солнца. В основном у Java было 5 с лишним лет, когда не было организации / руководства - поэтому не было новых возможностей.
Теластин
7
C # 1 имел типы значений. То, что у Java никогда не будет. Так что не просто «наглый грабеж».
Ден
1
@Telastyn - я думаю, что это единственная самая важная причина здесь. Особенно, когда вы добавляете «и затем вы приобретаетесь оракулом» в конце падения Солнца.
Вьятт Барнетта
7
Согласитесь с @Den. Я думаю, что главная причина того, что C # развивается быстрее (и в правильном направлении), - это лидерство Андерса Хейлсберга. Он и его команда добавили лучшие функции из других языков и сумели беспрепятственно интегрировать их в C #. В результате C # имеет очень аккуратные языковые функции, не чувствуя беспорядка или беспорядка.
Дэвид Киркланд,
1
@WesleyWiser - повышен до уровня «возможно, в будущем».
Ден
4

Я бы добавил к ответу Килиана, что одно большое различие между Java и C # заключается в том, что разработчики C # контролируют не только язык, но и стандартную среду IDE.

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

Поскольку от вас ожидают, что вы сможете скомпилировать Java с выбранной вами платформой (Eclipse, Netbeans, vi + Ant), добавить функции, которые нарушают код (и использовать их для разработки дополнительных расширений, таких как LINQ), гораздо сложнее, чем просто сказать " Поскольку IntelliSense будет заниматься этими случаями, нам не о чем беспокоиться ».

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

Не поймите меня неправильно, я думаю, что C # представил несколько примечательных нововведений, и я хочу, чтобы когда-нибудь большие боссы Oracle проснулись и запустили настоящую «Java 2», чтобы включить некоторые из них, но разрыв не так очевиден, как ваш вопросы

SJuan76
источник
2
Девять строк, необходимых для простого определения свойства (объявление + get / set + пробел), быстро складываются в более чем «несколько».
Кевин Клайн
@kevincline и я также правильно документируем как сеттеры, так и геттеры. Но, в конце концов, даже если я не использую свою автоматическую генерацию кода IDE для средства доступа, я не использую сколько-нибудь заметное количество времени с ними, если учесть время, потраченное на бизнес-логику, тестирование, разработку кода (на самом деле Я в основном думаю об этом даже при наборе доступа). Так что, в то время как приятно, это не то, что имеет большое значение в конце ...
SJuan76
3
Сейчас не время их писать. Настало время читать и игнорировать их снова и снова, снова и снова, пока вы на пути к интересным частям.
Кевин Клайн
@kevincline Я согласен, это почти читабельность и чистый код. Вот почему я ценю такие вещи, как события, которые являются просто встроенным шаблоном Observer, но которые делают вещи намного чище, если вам пришлось писать их самостоятельно
Авив Кон
@AvivCohn Дело в том, что «встроенный» является ключевой частью. Вы можете иметь динамическую отправку в сборке, вы можете иметь функции высшего порядка в C, каждая функция языка вы можете иметь это возможно в сборе - очевидно, так как в какой - то момент, он все еще работает на вашем x86 CPU. Вам редко нужно реализовывать шаблон Command в C #, потому что у вас есть делегаты. То же самое с Observer и событиями, и многими другими. Некоторое время в Java были анонимные методы, но вам нужно было создать целый анонимный тип . Все эти вещи крошечные, но они складываются.
Луаан