singlepost

C# или Java? << На главную или назад  

Что лучше C# или Java?
собираюсь переходить c C++

123 ответов в теме “C# или Java?”

  1. 48
    Павел Потапов ответил:

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

  2. 47
    Александр Микинас ответил:

    Стал писать на C# только потому, что нужно было работать с мелкософтовскими продуктами через com. Не жалею, затянуло.
    А насчет кроссплатформенности: сейчас популярны веб приложения, а хостингов с виндой уже хватает. Так что с моно в большинстве случаев можно не заморачиваться, ну или чуть переделать клиент, если нужно под линукс.

  3. 46
    Николай Митропольский ответил:

    Ну видимо немного не так поняли друг друга…
    Ну вообще, конечно, yield штука полезная)

  4. 45
    Александр Левантовский ответил:

    О, мне нравится: проголосовало 100 человек, 50 за Java, 50 за C# :D

  5. 44
    Жека Кирпичев ответил:

    Ну ладно; чувствую, мы перешли к вопросам терминологии :)

  6. 43
    Николай Митропольский ответил:

    Жека jkff Кирпичев, Да нет, против IEnumerator ничего не имею, хотя деййсвительно его реализация не является чистой.
    public static IEnumerable<int> inf()
    {
    int i = 0;

    while(true)
    {
    Console.WriteLn("Side Effect");
    yield return i++;
    }
    }
    И пожалуйста, будет вам побочный эффект у каждого енамератора, но разумеется этого можно добиться и без использования yield.

    Мои претензии не к тому. Мне не нравится метод, который может продолжить выполнение, уже после того, как вернул значение. А термин "чистый" я употребил не в плане отсутвия побочных эффектов, а в плане нарушения концепции функции.

  7. 42
    Илья Тимофеев ответил:

    #20 +1
    Можно добавить, что java дешевле будет :)
    А вообще, если уж тут затронули "фичи" синтаксиса C# советую прочитать следующую статью: //tinyurl.com/phvq7e

  8. 41
    Жека Кирпичев ответил:

    Николай, в общем, возьми код функции inf() и дизассемблируй его при помощи Lutz Reflector – увидишь, что никакими "лишними" побочными эффектами там и не пахнет.
    Фактически, получается какой-то такой код:
    class Inf : IEnumerable<int> {
    private int i;
    Inf() {i = 0;}
    int Current {get {return i;}}
    boolean MoveNext() {i++;}
    }
    IEnumerable<int> inf() {
    return new Inf();
    }

  9. 40
    Жека Кирпичев ответил:

    В таком случае я повторяю свой вопрос: правда ли, что ты против самой концепции IEnumerator как таковой? Ведь *любая* реализация IEnumerator – через yield ли, или не через yield – не является чистой.

  10. 39
    Жека Кирпичев ответил:

    Николай, покажи, пожалуйста, пример кода, доказывающий наличие побочных эффектов *у функции inf()*, а не у методов объекта, возвращенного ею.

  11. 38
    Николай Митропольский ответил:

    Ну если их разделять, то у самой функции побочных эффектов нет. Но при вызове методов Енамератора вызывается код, написанный внутри функции.

  12. 37
    Александр Новиков ответил:

    Оп-кун, учите оба языка )

  13. 36
    Александр Левантовский ответил:

    Думаю, надо сравнивть по двум критериям: язык и платформа.
    Я бы сформулировал так:

    Java как язык – более рафинированный, более простой, логичный, менее разлапистый. Все фишки и тонкости, добавленные в C# с одной стороны упрощаю жизнь, с другой усложнят тем, что более сложны для понимания человеком (только не надо писать, что все просто или надо привыкнуть, дело в том, что все равно чем больше "фишек", тем больше напряжение мозга, хотя и подсознательное; даже аозвращение значения через параметр – уже весьма и весьма спорное решение).

    Что же касается платформы, то Java – поистине кроссплатформенный (хотя надо знать тонкости и для Mac и для Linux и т.п.), в C# этим пока на серьезном уровне не пахнет.

  14. 35
    Николай Митропольский ответил:

    Ну а в чем я не прав? не будет ленивых вычислений?
    public static IEnumerable<int> inf()
    {
    int i = 0;

    while(true)
    {
    yield return i++;
    }
    }

    Каждое следудщее значение зависит от i,значение i сохраняется внутри функции.

  15. 34
    Жека Кирпичев ответил:

    > Может я конечно что-то путаю
    Путаешь :)

    #33 – согласен. Считаю, что checked exceptions категорически нужны; более того, с их помощью можно даже слегка моделировать системы эффектов.

  16. 33
    Николай Митропольский ответил:

    > Это неверно. Это функция, возвращающая итератор, ничем не хуже любой другой функции, возвращающей итератор.

    Может я конечно что-то путаю но разве такая функция(которая с yield) не начинает хранить в себе состояние? Например локальные переменные этой функции разве сбрасываются при "возвращении значения"? Тут же вообще должны возникать ленивые вычисления, которых в обычных функциях нет, так что это вовсе не обычная функция.

    Александр Quyse Lert, да указывать вы можете и в шарпе, другой вопрос нет checked exceptions, но от них сознательно отказались. Вообще сейчас больше распространено мнение, что чекед ексепшинс не нужны

  17. 32
    Александр Lert ответил:

    Плюс явы – что метод должен указывать, какие исключения он может кидать. По-моему, дотнету этого недостает.

  18. 31
    Жека Кирпичев ответил:

    Уточняю: не-чистыми в обоих случаях являются *методы возвращаемого итератора*, а не функция, которая этот итератор возвращает.

  19. 30
    Жека Кирпичев ответил:

    > Проблема в том, что если функция содержит yield return то она больше не функция

    Это неверно. Это функция, возвращающая итератор, ничем не хуже любой другой функции, возвращающей итератор.

    Нет никакой разницы между

    IEnumerable<int> onetwothree() {
    yield return 1; yield return 2; yield return 3;
    }
    и
    IEnumerable<int> onetwothree() {
    return new int[] {1,2,3};
    }

  20. 29
    Николай Митропольский ответил:

    > Так yield return – это просто способ реализации IEnumerator<T>
    Ну все есть реализация чегонибудь) Проблема в том, что если функция содержит yield return то она больше не функция, а некое новое синтаксическое явление. Для например Питона это не страшно ибо там функция есть объект, а объект может оказаться функцией) Но для джавы, где это не так, такая конструкция по сути являлась бы новой сущностью

  21. 28
    Павел Потапов ответил:

    #8, #9

    Надо бы знать, что CLR – это реализация CLI, так же как и Mono.

    //en.wikipedia.org/wiki/Common_Language_Infrast...

    Что касается несовместимости, то полагаю что, как и со всякими другими стандартами, новые версии не сразу поддерживаются всеми реализациями.

    Пример приложения, работающего на разных ОС (найдено со странички Mono в Википедии):
    //en.wikipedia.org/wiki/Open_Mobile

    ЗЫ Кстати, есть еще такая штука, как Silverlight, которая работает и на линухах (см Moonlight), а также имеется реализация под Mac OS.

  22. 27
    Николай Митропольский ответил:

    Ну да… вспоминая JDBC можно слогласиться, не очень хорошо получается с close(), но честно скажу ввесьма редко с этим сталкиваюсь, и не то чтоб меня это сильно напрягало.

    > yield return
    Ну функция, которя возвращает несколько значений в разные моменты времени довольно суровая штука) По сути, генератор для ПП это новая сущность.

    > и укладываются в массивы непосредственно, а не ссылками (и не могут быть null).
    Ну да, зато копируются по значению и тем самым сьъедают свой выигрыш в производительности обратно. Хотя в целом против страктов ничего не имею, но особой радости от них тоже не испытываю.
    Ну с null это известная проблема, она и в шарпе сплошь и рядом.

  23. 26
    Жека Кирпичев ответил:

    Так yield return – это просто способ реализации IEnumerator<T>. Ты, получается, возражаешь против самой идеи итераторов?

  24. 25
    Жека Кирпичев ответил:

    using – не согласен, что освобождение ресурсов – редкость.
    И как ни крути, синтаксис освобождения ресурсов в джаве – жопа, тем более что какого-то хрена методы close() обычно бросают checked exceptions (ну и что с ними делать?). Освободить несколько, особенно взаимозависимых, ресурсов – синтаксическая каша.

    yield return – а какие проблемы с его чистотой?

    struct: во-первых, только с -XX:+DoEscapeAnalysis и только в последних версиях джавы; во-вторых, есть и другие отличия, влияющие на производительность, которых от джавы не дождешься: struct занимают меньше памяти за счет отсутствия (видимо) заголовка у объектов, и укладываются в массивы непосредственно, а не ссылками (и не могут быть null).

  25. 24
    Oleg Іванов ответил:

    holly war!!!!!!
    holly war!!!!!!
    holly war!!!!!!
    holly war!!!!!!
    holly war!!!!!!
    holly war!!!!!!

  26. 23
    Николай Митропольский ответил:

    > reified generics. Сколько граблей из-за generic type erasure в Java!
    Ну тут да, генерики в жаве убоги(( проще говоря их нет) Зато есть гарантии, что ход работы программы не зависит от параметризуемого типа, если это понимать в таком ключе, то все становится логично. Всю зависимую функциональность можно делегировать куда-нибудь – громоздко, но гораздо более наглядно.
    > – using. Ну знаете ли, если вы не забываете написать юзинг, то не забывайте написать клозе. Да и вообще освобождение ресурсов в жаве – такая редкость, это вам не интерлопом с ком в C# заниматься
    > – yield return.
    Ну тут да, это полезная штука,пару раз сожалел что ее нет. Но вообще есть некоторые сомнения в ее чистоте для процедурного программирования.
    > – делегаты.
    нафиг плодить сущности. анонимные классы наше все! хотя тут конечно всплывает отсутвие в джаве нормального метапрограммирования, но это всеравно не повод.
    > – struct
    Ну авторы джавы клянутся и божатся, что потерь в производителности нет, все что можно выделить на стеке выделяется на стеке и так.

  27. 22
    Жека Кирпичев ответил:

    Не согласен, что все приведенные мною особенности шарпа – рюшечки, усложняющие язык. Как минимум, нижеприведенные фичи его, наоборот, упрощают и делают более надежным, удобным, отлаживаемым:
    - reified generics. Сколько граблей из-за generic type erasure в Java!
    - using. Сколько утечек ресурсов в программах на Java из-за того, что приходится писать грязный, уродливый, повторяющийся и почти не абстрагируемый код для освобождения ресурсов!
    - yield return. Как трудно на Java писать сколько-нибудь сложные итераторы из-за отсутствия подобного интуитивного и удобнейшего средства!
    - делегаты. Сколько красивых приемов программирования, будучи переведенными на Java, превращаются в грязное месиво из анонимных классов!
    - struct: практически нисколько не усложняют язык, однако предоставляют улучшенные возможности для взаимодействия с внешним миром и оптимизации производительности.
    Остальное, возможно, можно и отнести к рюшечкам.

  28. 21
    Анатолий Лютин ответил:

    Да ладно холивар – мы сами себя тешим ;)

  29. 20
    Oleg Іванов ответил:

    #14
    +1
    повторюсь
    Holly War!!!

  30. 19
    Николай Митропольский ответил:

    Java гораздо более простой и чистый язык. Да в нем нет всяких рюшечек,рюшечки шарпа на мой взгляд часто лишь ухудшают читаемость и отлаживаемость кода, вспомнить хотяб Explicit Interface Implementation.

    Я за джаву.

    Еще к джаве есть много бесплатных офигенных IDE, которые напишут все за вас)

  31. 18
    Анатолий Лютин ответил:

    Согласен. Как язык C#, естественно, развитие Java-языка. Но .Net платформа менее гибка чем Java.

    Обосновываю (имею ввиду платформу):
    Java-таки нативно работает в большинстве ОС
    Java легко расширяется
    Java интегрируется со всем что угодно, а не только с продуктами от MS
    Java охватывает embedded устройства
    Java открыта (таки это свершилось)
    Java, как платформа, компактнее
    Java имеет транспорты и универсальные коннекторы к "чужим" компонентам
    Основные библиотеки Java мультиплатформенны и не прибиты гвоздями к конкретной ОС.

    Поймите мою точку зрения, мне нравится C#, но из-за того что он прибит гвоздями к .Net, а .Net впаян в Windows, его применение для меня резко ограничено. Java в этом плане удобнее. Написал один раз и не паришься какие у тебя целевые машины и сервера.

  32. 17
    Andrey Panov ответил:

    чай или кофе?
    высказываемся

  33. 16
    Andrey Panov ответил:

    а #14 меня опередил))))

  34. 15
    Жека Кирпичев ответил:

    #11. Мотивирую:
    Фундаментальные (неэмулируемые или очень трудно эмулируемые) преимущества:
    - В C# есть reified generics
    - В C# есть yield return
    - В C# есть struct
    - В C# есть unsafe блоки и указатели на крайний случай
    - В C# есть expression trees

    Синтаксические (эмулируемые) преимущества:
    - В C# есть using
    - В C# есть out и ref параметры
    - В C# есть замыкания с приличным синтаксисом (делегаты и собственно лямбды)
    - В C# есть events
    - В C# есть много другого удобного синтаксиса: collection и object initializers, local type inference
    - В C# есть LINQ

  35. 14
    Анатолий Лютин ответил:

    #14
    +1

    Хотя тут не обсуждение что лучше. Тут доказывают, что если к протвиню от Electrolux плиты примотать проволоку, да дырочек насверлить, то его, наверное, можно будет подвесить на треногу и попытаться сварить в нём суп (только через каждые 5 секунд вода будет выливаться).

    "вы всё ещё завариваете чай в коптильне установленой на пароварку? ммм.. мы вызываем санитаров к вам."

    Очень похоже на попытки перетащить что-нибудь .Net-ое на Mono.

    P.S: А котелок-то подходит для того чтобы его в духовку поставить!! ;)

  36. 13
    Владимир Бондарец ответил:

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

  37. 12
    Жека Кирпичев ответил:

    C# как язык гораздо более продвинут и "правильно" сделан, нежели Java.

  38. 11
    Анатолий Лютин ответил:

    #10, если годик поработаешь в ФСБ, то, наверное, тоже тяжело работать программистом – затягивает :)

  39. 10
    Анатолий Лютин ответил:

    #11 -обоснования и ссылки в студию. "Правильность" – очень субъективно, хотя не лишено логики, т.к. c# делался по образу и подобию Java с максимальной на неё оглядкой : //ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B0%D0%B...

  40. 9
    Нгамдкхе Кверос ответил:

    (1) что лучше чайник или кастрюля?
    (2) лучше всего протвинь!
    (3) и как ты на треноге протвинь крепить собираешься? лучше походного котелка ничего быть не может!
    (4) чёго вы все несёте ни в котелке ни на протвине коптить не получится, надо нормальную rкоптильню.
    <…>

    вы всё ещё завариваете чай в коптильне установленой на пароварку? ммм.. мы вызываем санитаров к вам.

  41. 8
    Анатолий Лютин ответил:

    #7 Как язык для CLR может быть кроссплатформенным? Поясните ваше высказывание. Естественно, в данном треде кроссплатформенностью считается возможность запуска в различных ОС.

  42. 7
    Анатолий Лютин ответил:

    Надо бы знать, что Mono – это open source проект, соответственно, MS на него плевать и каждый чих в спецификации платформы .Net и основных #-языков заставляют переписывать огромные участки кода проекта. Тем более на mono даже и не пахнет полноценной заменой _платформы_ .Net, не говоря уже о том, что C# и .Net вне Windows _бесполезны_. Hello world, написанный на C#, конечно запуститься, но любой энтрепрейс, особенно, с использованием legacy com-объектов (изюм .Net), да с многопоточностью, засрёт консоль сообщениями чего ему в этом mono не хватает только для запуска, не говоря о том, что ему будет не хватать для работы. .Net создан для того чтобы интегрировать всё с Windows, а не с целевой платформой.

  43. 6
    Павел Потапов ответил:

    Как уже писали выше, есть Mono, так что в C# кроссплатформенность в принципе есть…

  44. 5
    Анатолий Лютин ответил:

    Конечно лучше, в C# её нет в принципе.

  45. 4
    Александр Васюченко ответил:

    Да, видимо в Java лучше с кросплатформенностью…

  46. 3
    Илья Попов ответил:

    вообще на рынке сейчас джава актуальная скорее в ынтерпрайзе (j2ee и все что прилагается), c# – тоже актуально (sharepoint), но тут я точно сказать не могу, зависит от ситуации. ТАк что выбор должен основываться на предполагаемых задач, имхо.

    Я же стараюсь быть способным решить задачу на обоих платформах, и, как следствие, понимать для чего что лучше использовать

  47. 2
    Александр Шабалин ответил:

    В принципе, зависит от ситуации. Если писать только под Винду, то следует пользоваться Шарпом, ибо .NET со своей библиотекой, да и сам язык в общем-то, уже обогнали Яву по функциональности и удобству написания. Что же касается других ОС – кроссплатформенная среда Mono(для запуска .NET под ОС отличными от Windows), по словам моего знакомого, выполняет код отлично от того как надобно, следовательно, лучше использовать в таких случаях Яву.

  48. 1
    Oleg Іванов ответил:

    Я прогаю на С#.
    Реально ет холвар

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.