Mono лучше ориентируется на платформы, которые я хочу поддерживать. Помимо этого, все это субъективно.
Я использую код C # на следующих платформах: - iOS (iPhone / iPad) - Android - Интернет (HTML5) - Mac (OS X) - Linux - Windows
Я мог бы поделиться им даже в большем количестве мест: - Windows Phone 7 - Wii - XBox - PS3 - и т. Д.
Важнее всего iOS, поскольку MonoTouch работает фантастически. Я не знаю ни одного хорошего способа настроить таргетинг на iOS с помощью Java. Вы не можете настроить Java для Windows Phone 7, поэтому я бы сказал, что времена, когда Java была лучше для мобильных устройств, остались позади.
Но самым большим фактором для меня является личная продуктивность (и счастье). C # как язык на годы опережает Java. IMHO, и .NET framework доставляет удовольствие. Большая часть того, что добавляется в Java 7 и Java 8, уже много лет написано на C #. Хотя языки JVM, такие как Scala и Clojure (оба доступны в CLR), довольно хороши.
Я рассматриваю Mono как самостоятельную платформу (отличную платформу) и отношусь к .NET как к реализации Microsoft Mono в Windows. Это означает, что я сначала разрабатываю и тестирую на Mono. Это прекрасно работает.
Если бы и Java, и .NET (скажем, Mono) были проектами с открытым исходным кодом без какой-либо корпоративной поддержки, я бы каждый раз выбирал Mono вместо Java. Я считаю, что это просто лучшая платформа.
И .NET / Mono, и JVM - отличный выбор, хотя я бы лично использовал для JVM другой язык, кроме Java.
Мое мнение о некоторых других комментариях:
Проблема: Производительность.
** Ответ: И JVM, и CLR работают лучше, чем говорят недоброжелатели. Я бы сказал, что JVM работает лучше. Mono обычно медленнее, чем .NET (хотя и не всегда).
Я лично возьму ASP.NET MVC вместо J2EE в любой день как разработчик, так и конечный пользователь. Поддержка собственного клиента Google тоже довольно крутая. Кроме того, я знаю, что плохая производительность графического интерфейса для настольных приложений Java должна быть в прошлом, но я продолжаю находить медленные. Опять же, то же самое можно сказать и о WPF. GTK # работает достаточно быстро, поэтому нет причин, по которым они должны быть медленными.
Проблема: Java имеет более обширную экосистему доступных библиотек.
Ответ: Возможно, правда, но на практике это не проблема.
Практически каждая библиотека Java (включая JDK) работает на .NET / Mono просто денди благодаря IKVM.NET. . Эта технология - настоящее чудо. Интеграция потрясающая; вы можете использовать библиотеку Java, как если бы она была родной. Однако мне пришлось использовать библиотеки Java только в одном приложении .NET. Экосистема .NET / Mono обычно предлагает больше, чем мне нужно.
Проблема: Java имеет лучшую (более широкую) поддержку инструментов
Ответ: не в Windows. В остальном я согласен. Хотя MonoDevelop хорош.
Я хочу поблагодарить MonoDevelop ; это жемчужина. MonoDevelop объединяет большинство инструментов, которые я хочу использовать, включая завершение кода (intellisense), интеграцию с Git / Subversion, поддержку модульных тестов, интеграцию SQL, отладку, простой рефакторинг и просмотр сборок с декомпиляцией на лету. Замечательно использовать одну и ту же среду для всего, от веб-сервера до мобильных приложений.
Проблема: совместимость на разных платформах.
Ответ: Mono - это единая кодовая база для всех платформ, включая Windows.
Сначала разработайте для Mono и, если хотите, разверните в .NET в Windows. Если вы сравните .NET с MS с Java, то Java имеет преимущество с точки зрения согласованности между платформами. См. Следующий ответ ...
Проблема: Mono отстает от .NET.
Ответ: Нет. ИМХО, это часто повторяющееся, но неверное утверждение.
Дистрибутив Mono от Xamarin поставляется с C #, VB.NET, F #, IronPython, IronRuby и, я думаю, может быть Boo из коробки. Компилятор Mono C # полностью обновлен с помощью MS. Компилятор Mono VB.NET отстает от версии MS. Остальные компиляторы одинаковы на обеих платформах (как и другие языки .NET, такие как Nemerle, Boo и Phalanger (PHP)).
Mono поставляется с большим количеством фактического написанного кода Microsoft, включая среду динамического языка (DLR), платформу управляемой расширяемости (MEF), F # и ASP.NET MVC. Поскольку Razor не является Open Source, Mono в настоящее время поставляется с MVC2, но MVC3 отлично работает с Mono.
Базовая платформа Mono идет в ногу с .NET за многие годы, и ее совместимость впечатляет. Сегодня вы можете использовать весь язык C # 4.0 и даже некоторые функции C # 5.0. Фактически, Mono часто опережает .NET во многих отношениях.
Mono реализует части спецификации CLR, которые не поддерживает даже Microsoft (например, 64-битные массивы). Одна из самых захватывающих новых технологий в мире .NET - это Rosylyn . Mono уже много лет предлагает компилятор C # в качестве услуги. Кое-что из того, что предлагает Rosylyn, также доступно через NRefractory . Примером того, где Mono все еще впереди, могут быть инструкции SIMD для повышения производительности в играх.
Microsoft предлагает ряд продуктов поверх .NET, которые недоступны в Mono, из-за чего возникло неправильное представление о задержке Mono. Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) - это примеры продуктов, которые не работают или плохо поддерживаются в Mono. Очевидное решение - использовать вместо этого кроссплатформенные альтернативы, такие как GTK #, NHibernate и ServiceStack.
Проблема: Microsoft - это зло.
Ответ: Верно. Ну и что.
Многие люди предлагают следующие причины избегать использования Mono:
1) Вы не должны использовать Mono, потому что следует избегать технологий Microsoft
2) Mono - отстой, потому что он не позволяет использовать все технологии, которые предлагает Microsoft
Мне ясно, что эти утверждения несовместимы. Я отвергаю первое утверждение, но пропущу здесь этот аргумент. Второе утверждение верно для всех альтернатив .NET.
JVM - отличная платформа, и рост количества языков JVM впечатляет. Используйте то, что делает вас счастливым. На данный момент для меня это чаще всего .NET / Mono.