Які основні відмінності між C # та Java?


209

Я просто хочу уточнити одне. Це не питання, на якому краще - ту частину, яку я залишаю комусь іншому для обговорення. Мені це не байдуже. Мені було задано це питання на співбесіді з роботою, і я подумав, що може бути корисним дізнатися трохи більше.

Це я можу придумати:

  • Java - "незалежна платформа". Ну і сьогодні ви можете сказати, що є проект Mono, тому C # можна було б також розглянути, але я вважаю, що це трохи перебільшує. Чому? Що ж, коли новий реліз Java виконаний, він одночасно доступний на всіх платформах, які він підтримує, з іншого боку, скільки функцій C # 3.0 ще не вистачає в реалізації Mono? Або насправді тут слід порівнювати CLR проти JRE ?
  • Java не підтримує події та делегатів. Наскільки мені відомо.
  • У Java всі методи є віртуальними
  • Інструменти розробки: я вважаю, що ще не існує такого інструменту, як Visual Studio. Особливо, якщо ви працювали з командними виданнями, ви знаєте, що я маю на увазі.

Будь ласка, додайте інших, які вважаєте за потрібні.

Оновлення: Щойно з'явившись у мене, у Java немає чогось подібного до спеціальних атрибутів для класів, методів тощо. Або це?


1
Мови відрізняються від мовних реалізацій, які також відрізняються від бібліотек. Що ви намагаєтеся порівняти?
Мігель Пінг


2
Я знайшов цей msdn.microsoft.com/en-us/library/ms836794.aspx Він охоплює як подібність, так і різницю між C # і java.
Біпул

1
Ви можете отримати багато речей, згаданих нижче про Java, з потрібними бібліотеками. Перевірте, наприклад, цей дійсний код Java: new String [] {"james", "john", "john", "eddie"} .wherewhere (beginWith ("j")). Razloct (); Тут використовується бібліотека під назвою lombok-pg. Її можна знайти за адресою github.com/nicholas22/jpropel
NT_

Відповіді:


329

Порівняння Java 7 та C # 3

(Деякі функції Java 7 тут не згадуються, але usingперевага твердження всіх версій C # над Java 1-6 видалено.)

Не все ваше резюме правильне:

  • У Java методи за замовчуванням є віртуальними , але ви можете зробити їх остаточними. (У C # вони запечатані за замовчуванням, але ви можете зробити їх віртуальними.)
  • Для Java існує безліч IDE, як безкоштовних (наприклад, Eclipse, Netbeans), так і комерційних (наприклад, IntelliJ IDEA)

Крім цього (і що вже є у вашому резюме):

  • Родослови між двома абсолютно різняться; Java-дженерики - це лише "трюк" (але корисний при цьому). У C # і .NET дженерики підтримуються і під час виконання, і працюють як для типів значень, так і для посилальних типів, зберігаючи відповідну ефективність (наприклад, List<byte>як byte[]підтримку, а не масив байтованих байтів.)
  • C # не має перевірених винятків
  • Java не дозволяє створювати визначені користувачем типи значень
  • У Java немає перевантаження оператора та конверсії
  • У Java немає блоків ітераторів для простої реалізації ітераторів
  • У Java немає нічого подібного до LINQ
  • Частково через відсутність делегатів, Java не має нічого подібного до анонімних методів та лямбда-виразів. Анонімні внутрішні класи зазвичай виконують ці ролі, але незграбно.
  • У Java немає дерев виразів
  • У C # немає анонімних внутрішніх класів
  • У C # взагалі немає внутрішніх класів Java, насправді - всі вкладені класи в C # схожі на статичні вкладені класи Java
  • Java не мають статичні класи (які не мають жодних - або примірника конструктора, і не можуть бути використані для змінних, параметрів і т.д.)
  • Java не має жодного еквівалента анонімним типам C # 3.0
  • Локальні змінні неявно не набрали явно
  • У Java немає методів розширення
  • У Java немає виразів ініціалізатора об'єктів та колекцій
  • Модифікатори доступу дещо відрізняються - у Java немає (наразі) прямого еквівалента складання, так що немає ідеї "внутрішньої" видимості; у C # немає еквіваленту видимості "за замовчуванням" на Java, яка враховує простір імен (і успадкування)
  • Порядок ініціалізації в Java та C # тонко різний (C # виконує змінні ініціалізатори перед ланцюговим викликом до конструктора базового типу)
  • Java не має властивостей як частини мови; вони є умовою методів get / set / is
  • У Java немає еквівалента "небезпечного" коду
  • Interop у C # (і .NET взагалі) простіше, ніж JNI Java
  • Java та C # мають дещо різні ідеї переліків. Java набагато більш орієнтовані на об'єкти.
  • У Java немає директив препроцесора (#define, #if тощо в C #).
  • У Java немає еквівалента C # refі outдля передачі параметрів за посиланням
  • У Java немає еквівалента часткових типів
  • Інтерфейси C # не можуть оголошувати поля
  • У Java немає цілих цілей без підпису
  • Java не підтримує мови для десяткового типу. (java.math.BigDecimal надає щось на зразок System.Decimal - з відмінностями - але немає мовної підтримки)
  • У Java немає еквівалента типів, що зводяться до значення
  • Бокс в Java використовує заздалегідь задані (але "нормальні") типи посилань з певними операціями над ними. Бокс в C # і .NET - це більш прозора справа, при цьому тип посилань створюється для боксу CLR для будь-якого типу значення.

Це не є вичерпним, але воно охоплює все, що я можу подумати поза рукою.


24
@Brian: Я думаю, що дженерики Java та деталі внутрішніх класів досить швидко гасять ідею Яви про досягнення переваги через простоту;)
Джон Скіт

8
@OrangeDog: Люди сперечаються, що в основному жартують, IMO. Важко зрозуміти, як змушене писати явний блок "спробувати / нарешті" менш схильне до помилок, ніж оператор, що використовує IMO. Більшість "додаткових" функцій C # порівняно з Java означають, що ви можете піти, якщо писати менше коду, і що цей код може бути більш читабельним.
Джон Скіт

17
@OrangeDog: Наскільки ви неупереджені, ви не зацікавлені? Так, я є ентузіастом C #, але і з досить значним досвідом роботи Java - це, зрештою, моя робота. Це не так, як я не знаю, як ефективно використовувати Java.
Джон Скіт

8
@OrangeDog: Для початку більшість розробників не пишуть код, використовуючи "небезпечний", наскільки я знаю, тож це червона оселедець. Я також вважаю, що доцільність - це червона оселедець - я не думаю, що формальна доказовість має дуже багато спільного з тим, як легко людині міркувати про код. Моя думка полягає в тому, що, як досвідчений досвід роботи з Java, так і на C #, я вважаю, що C # є значно кращою мовою з точки зору продуктивності та читабельності. Якщо ви вважаєте навпаки, чи могли б ви уточнити рівень свого досвіду на обох мовах? Я думаю, що це досить актуально для дискусії.
Джон Скіт

21
@OrangeDog: Крім того, ваше твердження про те, що "вміння робити більше речей збільшує ймовірність того, що ви зробите їх неправильно", також є помилковим IMO ... тому що передбачається, що якщо ви не можете зробити щось, використовуючи функцію мова, яка робить це легким, вам не доведеться це робити зовсім. Це просто неправда - часто завдання, які потрібно виконати на Java та C #, однакові, але через відсутні функції, Java ускладнює правильне виконання цих завдань. Спрощуючи завдання, функція зменшує ймовірність того, що ви зробите це неправильно.
Джон Скіт

24

Далі подано велике поглиблене посилання Даре Обасанджо на відмінності між C # та Java. Мені завжди доводиться посилатися на цю статтю при переключенні між ними.

http://www.25hoursaday.com/CsharpVsJava.html


2
@Jon Skeet: ти самий активний розробник C #. Чому ви не підтримуєте свою версію відмінностей C # і Java. Надіюсь, люди люблять його читати.
кігті

1
@claws: Я не встиг зробити все, що хотів.
Джон Скіт

19
@Winston: Нам потрібні "відмінності між Чаком Норрісом та Джоном Скітом": 1) Чак Норріс завжди має час; Джон повинен змінити TimeDateклас, щоб завжди мати час, а ще не встиг :(
RedFilter

11

C # має автоматичні властивості, які неймовірно зручні, і вони також допомагають зберегти чистіший код, принаймні, коли у ваших геттерів та сетерів немає спеціальної логіки.


10

Особливості C # Відсутні в Java • C # включає більш примітивні типи та функціональність для лову арифметичних винятків.

• Включає велику кількість нотаційних зручностей для Java, багато з яких, такі як перевантаження оператора та визначені користувачем касти, вже знайомі великій спільноті програмістів на C ++.

• Обробка подій є "громадянином першого класу" - це частина самої мови.

• Дозволяє визначити "структури", схожі на класи, але можуть бути виділені в стеці (на відміну від екземплярів класів у C # та Java).

• C # реалізує властивості як частину синтаксису мови.

• C # дозволяє операторам комутації працювати на рядках.

• C # дозволяє анонімні методи, що забезпечують функціональність закриття.

• C # дозволяє ітератор, який використовує спільні програми за допомогою ключового слова дохідності у функціональному стилі.

• C # має підтримку вихідних параметрів, сприяючи поверненню декількох значень, функцію, спільну для C ++ та SQL.

• C # має можливість псевдоніму просторів імен.

• C # має "Явне виконання учасників", що дозволяє класу спеціально реалізувати методи інтерфейсу, окремо від власних методів класу. Це дозволяє йому також реалізувати два різних інтерфейси, які, мабуть, мають однаковий метод. Методи інтерфейсу не повинні бути загальнодоступними; вони можуть бути доступними лише через цей інтерфейс.

• C # забезпечує інтеграцію з COM.

• Наслідуючи приклад C і C ++, C # дозволяє телефонувати за посиланням для примітивних та еталонних типів.

Особливості Java відсутні в C #

• Ключове слово Java Strofp гарантує, що результат операцій з плаваючою комою залишатиметься однаковим на всіх платформах.

• Java підтримує перевірені винятки для кращого застосування помилок та керування помилками.


9

Ще один хороший ресурс - http://www.javacamp.org/javavscsharp/ Цей веб-сайт перелічує багато прикладів, які ілюструють майже всі відмінності між цими двома мовами програмування.

Щодо атрибутів, у Java є Анотації, які працюють майже так само.


5

Джерела:

З Java generics ви фактично не отримуєте жодної ефективності виконання, яку ви отримуєте з .NET, оскільки, коли ви компілюєте загальний клас на Java, компілятор забирає параметр типу і підміняє Object скрізь. Наприклад, якщо у вас є Foo<T>клас, компілятор java генерує байт-код так, як ніби він був Foo<Object>. Це означає, що кастинг, а також бокс / розпакування доведеться робити у "фоновому режимі".

Я вже деякий час граю з Java / C #, і, на мою думку, основна різниця на мовному рівні - це, як ви вказали, делегати.


Це неправильно, стирання або переробка генерики (Java та C # відповідно) не обов'язково впливає на продуктивність.
Мігель Пінг

Ви плутаєте автобокс із кастингом.
JesperE

3
Ні, бруно має рацію щодо різниці у виконанні. Немає можливості отримати еквівалент списку <байт> (загалом) на Java. Потрібно мати список <Byte>, який би спричиняв штрафні санкції (час та пам'ять).
Джон Скіт

(Не) бокс буває лише для типів боксу, які є примітивними типами.
Мігель Пінг

1
Дивіться цю статтю: jprl.com/Blog/archive/development/2007/Aug-31.html
bruno conde

0

Перейдіть за посиланням, поданим нижче, msdn.microsoft.com/en-us/library/ms836794.aspx Він охоплює як подібність, так і різницю між C # та java

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.