Чому C # має набагато більше функцій, ніж Java? [зачинено]


14

Зверніть увагу, що це не має бути аргументом Java проти C #. Я Java-програміст, який не має досвіду C #, запитуючи просто з цікавості.

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

  • Введіть умовивід.
  • dynamic ключове слово.
  • Делегати.
  • Необов’язкові параметри.
  • Лямбда і LINQ (я насправді поняття не маю, що це таке).
  • Властивості.

Однак у Java насправді немає нічого, чого у C # немає.

Моє запитання: чому C # має набагато більше нативних функцій, ніж Java? І чому Java протягом багатьох років не додала щось із цього, наприклад, властивості чи умовиводи? Чи дизайнери мови Java застосовують більш спрощений підхід? У чому причина цього?


2
@Patrick - Це особливість - або деталі реалізації?
Піт

14
Упереджена відповідь: Тому що команда дизайнерів C # знає, що вони роблять. Більш обґрунтована відповідь: C # був розроблений з урахуванням невдач Java і без догматичного "лише чистого ОО" (що вони навіть не дуже потрапили). Половина цих функцій була масово імпортована з Lisp та Haskell, дві мови Java наполегливо відмовилися надихатись до java 8, а інші - поліпшення розуму, що сліпуче очевидні через відсутність Java у них.
Phoshi

4
Оскільки C # з'явився пізніше і спочатку був кричущим вимиванням Java, а потім мав можливість додати все, що виявилося доцільним на додаток, тоді як Java перешкоджали дуже суворим цілям відсталої сумісності.
Кіліан Фот

2
@ Clockwork-Muse, але C # має два варіанти виконання - CLR та Mono. Також є Ксамарін. Я не чув жодного рішення для створення проектів iOS / Android / WinPhone з використанням Java.
День

4
@KilianFoth: Насправді C # спочатку був прихованим вимиканням Delphi , переписаним на вигляд Java. Microsoft навіть бракував архітектора проекту Delphi далеко від Borland, щоб створити його.
Мейсон Уілер

Відповіді:


22

Кілька причин:

  1. C # з'явився пізніше Java; версія 1 виявилася кричущим вимиканням Java 1.4, тому в ній майже все було у Java.
  2. Але тоді C # розвивався набагато швидше, ніж Java, тому що це була нова захоплююча платформа (і мала надзвичайно блискучого водія в Андерса Хейльсберга, батька Турбо Паскаля). Це дозволило їм уникнути всіх помилок на Яві, які стали очевидними, додавши все те, чого бажали практикуючі Java.
  3. Тим часом, Java перешкоджала дуже суворим цілям відсталої сумісності та дещо повільнішим темпом розвитку, почасти тому, що вона відчайдушно намагалася завоювати репутацію стандартного, підприємливого, надійного, не дивного рішення для 95% не геніальних програмісти. У цьому їм це вдалося, можливо, занадто добре.

Результат полягає в тому, що у Java зараз є дещо розрив функцій. У нього є величезні плани на майбутнє, але, як завжди, з подібними речами все займає трохи більше часу, ніж планувалося.


7
Я не впевнений, що згоден з цим. Я маю на увазі, що це все правда, але я підозрюю, що причина пов'язана з політикою навколо краху ВС. Ява в основному мав 5+ років або більше там, де не було організації / керівництва - тому не було нових функцій.
Теластин

7
C # 1 мав типи значень. Щось, чого у Java ніколи не буде. Тож не просто "кричуще зривання".
День

1
@Telastyn - Я думаю, що це найважливіша причина тут. Особливо, коли ви додаєте "і тоді ви отримаєте оракул" до кінця колапсу Сонця.
Wyatt Barnett

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", щоб включити деякі з них, але розрив не такий очевидний, як ваш питання питання.


2
Дев'ять рядків, необхідних для простого визначення властивості (декларація + отримати / встановити + пробіл), швидко додаються до більш ніж "кількох".
кевін клайн

@kevincline, а також я правильно документую як сетерів, так і дільниць. Зрештою, навіть якщо я не використовую автоматичну генерацію коду IDE для аксесуара, я не використовую помітної кількості часу з цим, коли ви враховуєте час, витрачений на бізнес-логіку, тестування, дизайн коду (адже Я здебільшого думаю про це навіть під час набору аксесуарів). Тож хоч і приємно, але це не дуже
важливе

3
Не час їх писати. Настав час читати і ігнорувати їх знову і знову і знову і знову, поки ви рухаєтесь до цікавих частин.
кевін клайн

@kevincline Я погоджуюсь, це abiut читабельність та код чистий. Ось чому я ціную такі речі, як "Події", які є лише вбудованим шаблоном спостерігачів, але роблять речі набагато чистішими, якщо вам доведеться їх писати самостійно
Авів Кон

@AvivCohn Справа в тому, що "вбудований" є ключовою частиною. Ви можете мати динамічне відправлення в зборі, у вас можуть бути функції вищого порядку в C, кожна функція мови, яку ви можете мати , можлива в збірці - очевидно, оскільки в якийсь момент вона все ще працює на вашому процесорі x86. Вам рідко потрібно реалізувати шаблон Command в C #, тому що у вас є делегати. Те саме з спостерігачем та подіями та багатьма іншими. Ява певний час мав анонімні методи, але вам довелося створити цілий анонімний тип . Всі ці речі крихітні, але вони складаються.
Луаан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.