Каковы основные различия между 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. Я всегда обращаюсь к этой статье, когда переключаюсь между ними.
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