Каковы основные различия между 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"} .where (startWith ("j")). Different (); Он использует библиотеку под названием lombok-pg. Может быть найден на github.com/nicholas22/jpropel
NT_

Ответы:


329

Сравнение Java 7 и C # 3

(Некоторые функции Java 7 здесь не упомянуты, но usingпреимущество операторов всех версий C # по сравнению с Java 1-6 было удалено.)

Не все ваше резюме верно:

  • В Java методы являются виртуальными по умолчанию, но вы можете сделать их окончательными. (В C # они запечатаны по умолчанию, но вы можете сделать их виртуальными.)
  • Существует множество IDE для Java, как бесплатных (например, 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 нет выражений инициализатора объекта и коллекции
  • Модификаторы доступа несколько отличаются - в Java (в настоящее время) нет прямого эквивалента сборки, поэтому нет понятия «внутренней» видимости; в C # нет эквивалента видимости «по умолчанию» в Java, которая учитывает пространство имен (и наследование)
  • Порядок инициализации в Java и C # несколько отличается (C # выполняет инициализаторы переменных перед цепным вызовом конструктора базового типа)
  • У Java нет свойств как части языка; это соглашение методов get / set / is
  • Java не имеет эквивалента "небезопасного" кода
  • Взаимодействие проще в 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 и детали внутренних классов довольно быстро отменяют идею достижения Java за счет простоты;)
Джон Скит

8
@OrangeDog: Люди спорят, что в основном шутят, ИМО. Трудно понять, как принудительная запись явного блока try / finally менее подвержена ошибкам, чем оператор использования IMO. Большинство «дополнительных» возможностей C # по сравнению с Java означают, что вы можете избежать написания меньшего количества кода и что этот код может быть более читабельным.
Джон Скит

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

8
@OrangeDog: Для начала, большинство разработчиков не пишут код с использованием «unsafe», насколько я знаю, так что это красная сельдь. Я также думаю, что доказуемость - это красная сельдь - я не думаю, что формальная доказуемость во многом связана с тем, насколько легко человеку рассуждать о коде. Моя точка зрения заключается в том, что как человек с большим опытом работы с Java и C # я считаю, что C # является гораздо лучшим языком с точки зрения производительности и удобочитаемости. Если вы чувствуете обратное, не могли бы вы уточнить свои уровни опыта на обоих языках? Я думаю, что это довольно актуально для обсуждения.
Джон Скит

21
@OrangeDog: Кроме того, ваше утверждение о том, что «способность делать больше вещей увеличивает вероятность того, что вы сделаете их неправильно», также является ошибочным ИМО ... потому что оно предполагает, что если вы не можете что-то сделать, используя функцию язык, который облегчает, вам не придется делать это вообще. Это просто не соответствует действительности - часто задачи, которые необходимо выполнить в Java и C #, совпадают, но из-за отсутствующих функций Java затрудняет правильное выполнение этих задач. Упрощая задачу, эта функция снижает вероятность того, что вы сделаете это неправильно.
Джон Скит

24

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

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


2
@Jon Skeet: вы самый активный разработчик C #. Почему вы не поддерживаете свою версию C # и различий Java. Бьюсь об заклад, люди хотели бы прочитать это.
когти

1
@ Клос: У меня нет времени делать все, что я хотел бы.
Джон Скит

19
@Winston: Нам нужен список «различий между Чаком Норрисом и Джоном Скитом»: 1) У Чака Норриса всегда есть время; Джон должен изменить TimeDateкласс, чтобы всегда иметь время, и еще не успел :(
RedFilter

11

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


10

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

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

• Обработка событий - это «гражданин первого класса» - это часть самого языка.

• Позволяет определить «структуры», которые похожи на классы, но могут быть размещены в стеке (в отличие от экземпляров классов в C # и Java).

• C # реализует свойства как часть синтаксиса языка.

• C # позволяет операторам switch работать со строками.

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

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

• C # имеет поддержку выходных параметров, способствуя возвращению нескольких значений, что является общим для C ++ и SQL.

• C # может псевдоним пространства имен.

• C # имеет «Явную реализацию члена», которая позволяет классу специально реализовывать методы интерфейса, отдельно от своих собственных методов класса. Это также позволяет реализовать два разных интерфейса, которые имеют метод с одинаковым именем. Методы интерфейса не должны быть публичными; их можно сделать доступными только через этот интерфейс.

• C # обеспечивает интеграцию с COM.

• Следуя примеру C и C ++, C # позволяет вызывать по ссылке для примитивных и ссылочных типов.

Особенности Java отсутствуют в C #

• Ключевое слово Java StrongFP гарантирует, что результат операций с плавающей запятой остается неизменным на разных платформах.

• Java поддерживает проверенные исключения для лучшего обеспечения отслеживания и обработки ошибок.


9

Еще один хороший ресурс - http://www.javacamp.org/javavscsharp/ этом сайте приведено множество примеров, иллюстрирующих почти все различия между этими двумя языками программирования.

Что касается атрибутов, Java имеет аннотации, которые работают почти так же.


5

Обобщения:

В случае с обобщениями Java вы фактически не получаете той эффективности выполнения, которую вы получаете с .NET, потому что, когда вы компилируете обобщенный класс в Java, компилятор забирает параметр типа и везде заменяет объект. Например, если у вас есть Foo<T>класс, компилятор Java генерирует байт-код, как если бы он былFoo<Object> . Это означает, что кастинг, а также бокс / распаковка должны выполняться в фоновом режиме.

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


Это неправильно, стирание или преобразование обобщенных типов (Java и C # соответственно) не обязательно влияют на производительность.
Мигель Пинг

Вы путаете автобокс с кастингом.
JesperE

3
Нет, Бруно прав насчет разницы в производительности. Нет способа получить эквивалент List <byte> (в общем) в Java. Вы должны иметь List <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.