Каковы основные различия между С# и Java?
Я просто хочу прояснить одно. Это не вопрос, по которому лучше, эта часть, которую я оставляю кому-то другому, чтобы обсудить. Меня это не волнует.
Меня задали этот вопрос на собеседовании, и я подумал, что было бы полезно узнать немного больше.
Это те, которые я мог бы придумать:
- Java является "независимой от платформы". Хорошо, теперь вы можете сказать, что существует проект Mono, поэтому С# можно было бы считать слишком
Я считаю, что это немного преувеличивает. Зачем? Ну, когда новая версия Java выполнена, она доступна одновременно на всех поддерживаемых ею платформах, с другой стороны, сколько функций С# 3.0 все еще отсутствует в реализации Mono? Или это действительно CLR против JRE, что мы следует сравнить здесь?
- Java не поддерживает события и делегаты. Насколько я знаю.
- В Java все методы являются виртуальными
- Средства разработки: Я считаю, что такого инструмента еще нет, как Visual Studio. Особенно, если вы работали с командами, вы поймете, что я имею в виду.
Добавьте другие, которые, по вашему мнению, релевантны.
Обновление:
Просто я понял, что у Java нет каких-то пользовательских атрибутов для классов, методов и т.д. Или это?
Ответы
Ответ 1
Сравнение Java 7 и С# 3
(Некоторые функции Java 7 здесь не упоминаются, но преимущество выражения using
для всех версий С# по сравнению с Java 1-6 было удалено.)
Не все ваше резюме верное:
- В Java методы по умолчанию виртуальны, но вы можете сделать их окончательными. (В С# они по умолчанию закрыты, но вы можете сделать их виртуальными.)
- Существует множество IDE для Java, как бесплатных (например, Eclipse, Netbeans), так и коммерческих (например, IntelliJ IDEA).
Помимо этого (и что в вашем резюме уже):
- Дженерики совершенно разные между ними; Java-дженерики - это просто "трюк" времени компиляции (но полезный в этом). В С# и .NET дженерики также поддерживаются во время выполнения, а также работают для типов значений, а также ссылочных типов, сохраняя соответствующую эффективность (например,
List<byte>
как byte[]
, поддерживая его, а не массив байтов в байтах. )
- С# не проверял исключения
- Java не позволяет создавать пользовательские типы значений
- Java не имеет перегрузки оператора и преобразования
- Java не имеет блоков итератора для простой реализации итераторов
- Java не имеет ничего похожего на LINQ
- Отчасти из-за отсутствия делегатов Java не имеет ничего похожего на анонимные методы и лямбда-выражения. Анонимные внутренние классы обычно заполняют эти роли, но clunkily.
- Java не имеет деревьев выражений
- С# не имеет анонимных внутренних классов
- У С# вообще нет внутренних классов Java, на самом деле - все вложенные классы в С# похожи на статические вложенные классы Java
- Java не имеет статических классов (которые не имеют конструкторов экземпляров и не могут использоваться для переменных, параметров и т.д.)
- Java не имеет эквивалента анонимным типам С# 3.0
- Java не имеет неявно типизированных локальных переменных
- Java не имеет методов расширения
- Java не имеет выражений инициализатора объектов и коллекций
- Модификаторы доступа несколько отличаются - на Java там (в настоящее время) нет прямого эквивалента сборки, поэтому нет представления о "внутренней" видимости; в С# нет эквивалента видимости по умолчанию в Java, которая учитывает пространство имен (и наследование)
- Порядок инициализации в Java и С# немного отличается (С# выполняет инициализаторы переменных перед прикованным вызовом к конструктору базового типа)
- Java не имеет свойств как часть языка; они являются соглашением методов get/set/is
- Java не имеет эквивалента "небезопасного" кода
- Interop проще в С# (и вообще .NET), чем Java JNI
- Java и С# имеют несколько разные идеи перечислений. Java гораздо более объектно-ориентированные.
- В Java нет препроцессорных директив (#define, #if и т.д. на С#).
- Java не имеет эквивалента С#
ref
и out
для передачи параметров по ссылке
- Java не имеет эквивалента частичных типов
- Интерфейсы С# не могут объявлять поля
- Java не имеет беззнаковых целочисленных типов
- Java не поддерживает языковую поддержку десятичного типа. (java.math.BigDecimal предоставляет что-то вроде System.Decimal - с различиями - но там нет поддержки языка)
- Java не имеет эквивалента типов с нулевыми значениями
- Бокс в Java использует предопределенные (но "нормальные" ) ссылочные типы с конкретными операциями над ними. Бокс в С# и .NET является более прозрачным делом, при этом тип ссылки создается для бокса CLR для любого типа значения.
Это не исчерпывающий, но он охватывает все, что я могу думать о работе.
Ответ 2
Ниже приводится подробное описание Dare Obasanjo по поводу различий между С# и Java. Я всегда ссылаюсь на эту статью при переключении между ними.
http://www.25hoursaday.com/CsharpVsJava.html
Ответ 3
У С# есть автоматические свойства, которые невероятно удобны, а также помогают очищать ваш код чище, по крайней мере, когда у вас нет пользовательской логики в ваших геттерах и сеттерах.
Ответ 4
Особенности С# Отсутствуют в Java
• С# содержит более примитивные типы и функциональные возможности для исключения арифметических исключений.
• Включает большое количество нотационных удобств по сравнению с Java, многие из которых, такие как перегрузка операторов и пользовательские приведения, уже знакомы большому сообществу программистов на С++.
• Обработка событий - это "гражданин первого класса" - это часть самого языка.
• Позволяет определение "structs", которые аналогичны классам, но могут быть выделены в стеке (в отличие от экземпляров классов на С# и Java).
• С# реализует свойства как часть синтаксиса языка.
• С# позволяет операторам switch работать со строками.
• С# позволяет анонимным методам предоставлять функции закрытия.
• С# позволяет итератору использовать совлокальные подпрограммы с помощью ключевого слова yield в функциональном стиле.
• С# поддерживает выходные параметры, помогая возвращать несколько значений, функцию, совместно используемую С++ и SQL.
• С# имеет возможность псевдоним пространства имен.
• В С# есть "Явная реализация элемента", которая позволяет классу специально реализовывать методы интерфейса, отдельно от его собственных методов класса. Это позволяет ему также реализовать два разных интерфейса, которые имеют метод с тем же именем. Методы интерфейса не обязательно должны быть общедоступными; они могут быть доступны только через этот интерфейс.
• С# обеспечивает интеграцию с COM.
• Следуя примеру C и С++, С# разрешает вызов по ссылке для примитивных и ссылочных типов.
Особенности Java Отсутствуют в С#
• Java strictfp ключевое слово гарантирует, что результат операций с плавающей запятой остается одинаковым на всех платформах.
• Java поддерживает проверенные исключения для лучшего обеспечения захвата ошибок и обработки.
Ответ 5
Другим хорошим ресурсом является http://www.javacamp.org/javavscsharp/
На этом сайте перечислены многие примеры, которые иллюстрируют почти все различия между этими двумя языками программирования.
Об атрибутах, Java имеет аннотации, которые работают почти так же.
Ответ 6
Дженерики:
В Java-генераторах вы фактически не получаете какой-либо эффективности выполнения, которую вы получаете с .NET, потому что, когда вы компилируете общий класс в Java, компилятор убирает параметр типа и заменяет Object повсюду. Например, если у вас есть класс Foo<T>
, java-компилятор генерирует байтовый код, как если бы он был Foo<Object>
. Это означает, что кастинг, а также бокс/распаковка должны выполняться в "фоне".
Я играл с Java/С# некоторое время и, на мой взгляд, основное различие на уровне языка - это, как вы указали, делегаты.
Ответ 7
Пожалуйста, перейдите по ссылке, приведенной ниже. msdn.microsoft.com/en-us/library/ms836794.aspx
Он охватывает как сходство, так и разницу между С# и java