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

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

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

* Java является "независимой от платформы". Хорошо, теперь вы можете сказать, что существует проект [Mono](http://en.wikipedia.org/wiki/Mono_%28software%29), поэтому С# можно было бы считать слишком
Я считаю, что это немного преувеличивает. Зачем? Ну, когда новая версия Java выполнена, она доступна одновременно на всех поддерживаемых ею платформах, с другой стороны, сколько функций С# 3.0 все еще отсутствует в реализации Mono? Или это действительно [CLR](http://en.wikipedia.org/wiki/Common_Language_Runtime) против [JRE](http://en.wikipedia.org/wiki/JRE), что мы следует сравнить здесь?
* Java не поддерживает события и делегаты. Насколько я знаю.
* В Java все методы являются виртуальными
* Средства разработки: Я считаю, что такого инструмента еще нет, как Visual Studio. Особенно, если вы работали с командами, вы поймете, что я имею в виду.

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

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

 

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

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

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

* В Java методы по умолчанию виртуальны, но вы можете сделать их окончательными. (В С# они по умолчанию закрыты, но вы можете сделать их виртуальными.)
* Существует множество IDE для Java, как бесплатных (например, Eclipse, Netbeans), так и коммерческих (например, IntelliJ IDEA).

 .i1a { width: 336px; height: 280px; }
 @media(min-width: 768px) { .i1a { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .i1a { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .i1a { width: 728px; height: 90px; } }

 (adsbygoogle = window.adsbygoogle || []).push({});

Помимо этого (и что в вашем резюме уже):

* Дженерики совершенно разные между ними; 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 для любого типа значения.

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

 

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

 .i2a { width: 336px; height: 280px; }
 @media(min-width: 768px) { .i2a { width: 728px; height: 90px; } }
 @media(min-width: 992px) { .i2a { width: 360px; height: 300px; } }
 @media(min-width: 1083px) { .i2a { width: 728px; height: 90px; } }

 (adsbygoogle = window.adsbygoogle || []).push({});

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

 

Дженерики:

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

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

 

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