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

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

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

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

Добавьте другие, которые, по вашему мнению, релевантны.

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

+209
17 нояб. '08 в 10:07
источник поделиться
7 ответов

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

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

+329
17 нояб. '08 в 10:16
источник

Связанные вопросы


Похожие вопросы

Ниже приводится подробное описание Dare Obasanjo по поводу различий между С# и Java. Я всегда ссылаюсь на эту статью при переключении между ними.

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

+24
17 нояб. '08 в 10:55
источник

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

+11
17 нояб. '08 в 13:56
источник

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

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

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

• Позволяет определение "structs", которые аналогичны классам, но могут быть выделены в стеке (в отличие от экземпляров классов на С# и Java).

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

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

• С# позволяет анонимным методам предоставлять функции закрытия.

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

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

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

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

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

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

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

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

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

+10
04 янв. '12 в 16:01
источник

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

Об атрибутах, Java имеет аннотации, которые работают почти так же.

+9
20 нояб. '08 в 13:40
источник

Дженерики:

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

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

+5
17 нояб. '08 в 10:14
источник

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

0
02 мая '14 в 8:40
источник

Посмотрите другие вопросы по меткам или Задайте вопрос