Каковы основные различия между C# и Java?

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

Вот те, которые я мог придумать:

  • Java "не зависит от платформы". Ну, в настоящее время можно сказать, что есть проект Mono, поэтому C# тоже можно рассмотреть, но я считаю, что это немного преувеличивает. Зачем? Что ж, когда будет выпущен новый выпуск Java, он будет одновременно доступен на всех платформах, которые он поддерживает, с другой стороны, сколько функций C# 3.0 все еще отсутствует в реализации Mono? Или это действительно CLR против JRE, что мы должны сравнить здесь?
  • Java не поддерживает события и делегаты. Насколько я знаю.
  • В Java все методы являются виртуальными
  • Инструменты разработки: я считаю, что такого инструмента, как Visual Studio, пока нет. Особенно, если вы работали с командными изданиями, вы поймете, что я имею в виду.

Пожалуйста, добавьте другие, которые вы считаете актуальными.

Обновление: Просто всплыло у меня в голове, у Java нет чего-то вроде пользовательских атрибутов в классах, методах и т. Д. Или так?

7 ответов

Решение

Сравнение 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 создается тип ссылки для бокса для любого типа значения.

Это не является исчерпывающим, но оно охватывает все, что я могу придумать.

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

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

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

Особенности 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 strictfp гарантирует, что результат операций с плавающей запятой останется неизменным на разных платформах.

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

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

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

Обобщения:

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

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

Пожалуйста, перейдите по ссылке, приведенной ниже msdn.microsoft.com/en-us/library/ms836794.aspx Он охватывает как сходство, так и разницу между C# и Java

Другие вопросы по тегам