Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Что есть в Java, чего нет в C#?

Решил попробовать писать под андроид и столкнулся с необходимостью писать на Java. До этого писал больше на C#. Языки похожие во многом, но есть и отличия. И так как пока я C# знаю лучше Java, то так получается, что я пользуюсь только теми возможностями синтаксиса Java, которые знаю по C#. В общем, сейчас для меня java превратился в "урезаный C#", потому что каких-то чисто джавовских "фишек" я не знаю, а некоторых возможностей из C# в этом языке нет. Ну, например, в Java нет оператора ??, нет linq, нет свойств, нет атрибутов.
Так вот сам вопрос: а что есть в Java, чего нет в C#? Именно из синтаксиса, различных удобностей и синтаксического сахара.


Ответ

Смотрите.
В основном по фичам в данный момент C# идёт впереди Java, Java находится в позиции догоняющего. Однако есть несколько фич, которые есть в Java и нет в C# и которые при правильном использовании могут облегчить жизнь программисту.
1) Легковесные (анонимные) производные классы.
Пример:
new Thread(new Runnable() { // это анонимный производный класс! @override public void run() { // do some work } }).start();
В C# надо было бы объявить производный класс явно. Аналогичная, но не равносильная фича C# — анонимные методы, то есть лямбды.
2) Нестатические внутренние классы. В C# внутренние классы лишь логически находятся «внутри» и не имеют доступа к instance-переменным. В Java внутренние классы более богаты.
3) enum'ы. В C# они такие же, как в C++, и являются по существу именованными константами целочисленного типа. В Java enum'ы есть константы объектного типа, гораздо более богатые семантически.
4) checked exceptions. Вы можете объявлять как часть сигнатуры метода исключения, которые бросаются этим методом. В C# такой возможности нету. (Хотя разработчики C# считают, что эта фича не нужна и даже вредна, тем не менее по факту это фича, которая есть в Java и нет в C#.)
5) final-параметры. В C# const могут лишь переменные и поля, в Java можно параметр объявить как final, и при попытке его изменить компилятор наругается на вас.
6) SoftReference представляет собой «более сильную» версию WeakReference (которые тоже есть в Java): объекты, референсируемые ими, не удаляются, пока памяти хватает, даже если другие объекты уничтожаются в процессе сборки мусора.
7) У Java есть симпатичные помеченные блоки, которые позволяют выйти из любого количества циклов за раз (break) или пропустить итерацию во внешнем цикле (continue). Также break

Комментариев нет:

Отправить комментарий