Ответ 1
Хорошо, в то время как С# и Java внешне похожи друг на друга, существует ряд небольших отличий, которые могут вас укусить. Вообще, я думаю, что противоположное направление - от Java до С# - менее проблематично. Это в основном связано с тем, что С# является более сложным языком, поэтому вы можете найти много упрощений от обычных шаблонов Java, но наоборот может быть немного болезненным.
Что нужно посмотреть (неполный список, не гарантированный быть исчерпывающим):
-
Разные...
-
Соглашения об именах. В Java только имена типов начинаются с заглавной буквы (например, PascalCase), все остальное использует camelCase. Не очень сложно придерживаться, однако.
Также интерфейсы обычно не начинаются с
I
. С другой стороны, вы должны реализовать их с другим ключевым словом. Однако это не помогает в середине кода. -
Библиотека классов: -)
Несмотря на очевидность, именно это я потратил больше всего на изучение языка. Когда речь идет о известной парадигме, различия в синтаксисе быстро сортируются, но знакомство с стандартной библиотекой/библиотекой/структурой библиотеки занимает некоторое время в некоторых случаях: -)
- Patterns. Ну, не совсем, это все тот же материал. Но С# поддерживает некоторые шаблоны на уровне языка, в то время как вы все равно должны реализовывать их самостоятельно на Java. Нет событий, но шаблон Observer (очень распространенный в Swing - всякий раз, когда вы видите слушателя, вы знаете, что делать: -))
-
Обработка исключений. Java имеет так называемые проверенные исключения, что означает, что исключение должно быть уловлено или объявлено вверх. Обычно это означает, что у вас есть
catch (SomeException ex) { ex.printStackTrace(); }
довольно часто в вашем коде 1: -)
- Типы. Хотя .NET имеет обычные объекты и типы значений, они оба являются объектами и методами поддержки, свойствами и т.д. Java имеет дихотомию примитивных типов, таких как
int
,float
,char
, & c. и классы, такие какString
. Не имеет большого значения, так как они реализовали автоматическое боксирование, но иногда все еще раздражают обертываниеint
вInteger
. - Полиморфизм: все методы Java
virtual
по умолчанию, тогда как методы С# не являются.
-
- Незначительные синтаксические различия.
-
foreach (a in b)
→for (a : b)
- Различные ключевые слова для доступа. Такие вещи, как
internal
иprotected internal
, не существуют. Но неквалифицированные члены видны другим классам в одном пакете (вродеinternal
, но опять же не совсем). - Сравнение строк не выполняется с помощью
==
в Java. Вы должны использовать.equals()
. В то время как в С#==
для строк используется равенство значений, в Java==
всегда используется ссылочное равенство.
-
-
Нет...
- Свойства. В Java это обычно делается с шаблоном
Foo getFoo()
/void setFoo(Foo foo)
, который С# автоматически генерирует за спиной при использовании свойств, но вы должны делать это явно на Java. Как правило, чтобы упростить язык, многие вещи на Java являются просто соглашениями. Тем не менее, в большинстве случаев вам лучше придерживаться их: -) - Перегрузка оператора. Будучи опасным для праведного программиста, они не были реализованы, опасаясь злоупотребления. Не нужно их слишком часто, даже в С#, но иногда они приятные, а затем вы что-то упускаете.
- Индексаторы. Вам всегда нужно получить доступ к элементам списка через
myList.get(5)
вместо синтаксиса типаmyList[5]
. Однако лишь небольшое неудобство. - LINQ (хотя существуют реализации 2 но это не так хорошо интегрировано) или лямбда-функции 3 (в любом случае делегатов нет, но анонимных классов), методов расширения или частичные классы (да, это больно, когда речь идет о Свинге, если вы не очень дисциплинированы) и еще несколько вещей.
- Многомерные массивы. Вы можете использовать зубчатые массивы (массивы массивов), а также многомерность не существует.
- Свойства. В Java это обычно делается с шаблоном
- Generics - это только время компиляции, только во время выполнения
Object
остается. Также подстановочные знаки в дженериках могут быть трудно решить иногда, когда компилятор жалуется на все четыре?
в ваших дженериках, имеющих разные типы. (Хотя честно: это был случай, когда мне понадобилась информация о типе во время выполнения в любом случае, поэтому я вернулся кObject
s).
Общий совет: возьмите друга с опытом Java и дайте ему взглянуть на ваш код. Хотя он, вероятно, не может рассказать вам все, о чем вам следует позаботиться, когда вы прямо зададите ему этот вопрос, он может прекрасно заметить странные вещи в коде и уведомить вас об этом. Это очень помогло мне изучать Java (хотя сначала я изучил Java, а затем С#, поэтому он может быть другим).
1 Да, я знаю, что многие блоки catch выглядят по-другому, но все же, это, вероятно, архетипический и даже не тот редко.
2Quaere, JaQue, JaQu, Querydsl
3 Там lambdaj. Спасибо, что указали, что Esko.