¿Por qué razones debo elegir C # sobre Java y C ++? [cerrado]

46

C # parece ser popular en estos días. Escuché que sintácticamente es casi lo mismo que Java. Java y C ++ han existido por más tiempo. ¿Por qué razones debo elegir C # sobre Java y C ++?

Templario oscuro
fuente
16
Tal como está escrita, la pregunta era un ejemplo de libro de texto de no constructivo "¿qué idioma es mejor?" preguntas que están fuera de tema aquí. Intenté hacerlo más constructivo con una edición, ya que en realidad obtuvo respuestas buenas y bien pensadas. Aún así, tenga en cuenta las preguntas frecuentes y esta publicación de blog cuando haga preguntas de esta naturaleza.
Adam Lear
Permítanme agregar algunos elementos más afilados. .NET tiene un DOM bien definido ( por ejemplo, CodeDOM ) para su lenguaje y, en consecuencia, generar cosas dinámicamente en tiempo de ejecución es mucho más simple y más eficiente. Esto también puede ser útil como capacidad de infraestructura. Además, el sistema de tipos tiene una coincidencia 1 a 1 con todos los tipos W3 nativos. En esencia, W3 y otras interops se incorporaron al lenguaje desde el principio. Para otros idiomas, estas inquietudes se limitaron y presentan muchos desafíos para ellos. Además, si va a interactuar con muchos lenguajes y / o protocolos, .NET también es muy fuerte
JoeGeeky
55
Hola, JoeGeeky, agrega tu comentario como respuesta a la pregunta.
Anthony Mastrean
1
La verdadera pregunta es: ¿Por qué razones debo elegir Nemerle, F * y F # sobre C #? (es decir, los tres idiomas son de MS y los tres son mejores)
mrsteve
Realmente no creo que ninguna declaración del género "lenguaje / plataforma X en comparación con el lenguaje / plataforma Y sea SIEMPRE mejor" sea válida y también creo que para cualquier X e Y se puede invalidar fácilmente para ciertos contextos. ¿Cuál es el punto de esta pregunta?
Shivan Dragon

Respuestas:

76

La pregunta debería ser "¿Qué lenguaje es más adecuado para el desarrollo de aplicaciones moderno y típico?".

Editar: me dirigí a algunos de los comentarios a continuación. Una pequeña observación: considere que cuando tiene muchas cosas de forma nativa, como expresiones idiomáticas, es una gran diferencia que implementarlas o descargarlas y usarlas usted mismo cada vez. Casi todo se puede implementar en cualquiera de estos idiomas. La pregunta es: qué idiomas le proporcionan de forma nativa.

Así que fuera de mi cabeza (algunos argumentos se aplican a ambos idiomas) ...

C # es mejor que C ++ en eso:

  • Tiene recolección de basura nativa .
  • Le permite tratar las firmas de los métodos de clase como funciones libres (es decir, ignorar el thisargumento del puntero estáticamente tipado ) y, por lo tanto, crear relaciones más dinámicas y flexibles entre las clases. edite si no sabe lo que esto significa, luego intente asignar un método miembro que devuelva void y acepte void a una void (*ptr)()variable. Los delegados de C # llevan el thispuntero con ellos, pero el usuario no siempre tiene que preocuparse por eso. Simplemente pueden asignar un void()método de cualquier clase a cualquier otro void()delegado.
  • Tiene una gran biblioteca estándar con tantas cosas útiles que está bien implementada y es fácil de usar.
  • Permite bloques de código administrados y nativos.
  • El control de versiones de ensamblaje soluciona fácilmente los problemas de infierno de DLL.
  • Puede establecer que las clases, los métodos y los campos sean internos de ensamblaje (lo que significa que son accesibles desde cualquier lugar dentro de la DLL en la que están declarados, pero no desde otros ensamblajes).

C # es mejor que Java en eso:

  • En lugar de mucho ruido (EJB, implementaciones de clase estática privada, etc.), obtienes construcciones nativas elegantes y amigables, como Propiedades y Eventos.
  • Tienes genéricos reales (no la mala broma de casting que Java llama genéricos), y puedes reflexionar sobre ellos.
  • Admite modismos nativos de gestión de recursos (la usingdeclaración). Java 7 también va a soportar esto, pero C # lo ha tenido por mucho más tiempo.
  • No tiene excepciones marcadas :) (discutible si esto es bueno o malo)
  • Está profundamente integrado con Windows, si eso es lo que quieres.
  • Tiene Lambdas y LINQ, por lo tanto, admite una pequeña cantidad de programación funcional.
  • Permite tanto la covarianza genérica como la contravarianza explícitamente.
  • Tiene variables dinámicas, si las quieres.
  • Mejor soporte de enumeración, con la yielddeclaración.
  • Le permite definir nuevos tipos de valor (o no referencia).

Editar - Abordar comentarios

  • No dije que C ++ no es compatible con RAII nativo. Dije que Java no lo tiene (tienes que hacer un intento explícito / finalmente). C ++ tiene punteros automáticos que son excelentes para RAII y (si sabe lo que está haciendo) también puede sustituir la recolección de basura.
  • No dije nada sobre emular funciones gratuitas. Pero, por ejemplo, si necesita acceder a un campo mediante un thispuntero y vincular el método que lo hace a un puntero de función genérico (es decir, no en la misma clase), entonces simplemente no hay una forma nativa de hacerlo. En C #, obtienes el gratis. Ni siquiera tiene que saber cómo funciona.
  • Al "tratar los métodos miembros como funciones libres", me refería a que no puede, por ejemplo, vincular de forma nativa un método miembro a una firma de función libre, porque el método miembro "secretamente" necesita el thispuntero.
  • La usingdeclaración, obviamente junto con los envoltorios desechables, es un gran ejemplo de RAII. Ver este enlace . Tenga en cuenta que no necesita tanto RAII en C # como en C ++ porque tiene el GC. Para los momentos específicos que lo necesite, puede usar explícitamente la usingdeclaración. Otro pequeño recordatorio: liberar memoria es un procedimiento costoso. GC tiene su ventaja de rendimiento en muchos casos (especialmente cuando tiene mucha memoria). La memoria no se perderá y no pasará mucho tiempo en la desasignación. Además, la asignación también es más rápida, ya que no asigna memoria cada vez, solo de vez en cuando. Llamar newes simplemente incrementar un puntero de último objeto.
  • "C # es peor porque tiene recolección de basura". Esto es de hecho subjetivo, pero como dije en la parte superior, para el desarrollo de aplicaciones más moderno y típico, la recolección de basura es una gran ventaja.
    En C ++, sus opciones son administrar manualmente su memoria usando newy delete, lo que empíricamente siempre conduce a errores aquí y allá, o (con C ++ 11) puede usar punteros automáticos de forma nativa, pero tenga en cuenta que agregan montones y montones de ruido al código. Así que GC todavía tiene una ventaja allí.
  • "Los genéricos son mucho más débiles que las plantillas". Simplemente no sé de dónde sacaste eso. Las plantillas pueden tener sus ventajas, pero en mi experiencia las restricciones, la verificación de tipos de parámetros genéricos, la contravarianza y la covarianza son herramientas mucho más fuertes y elegantes. La fortaleza de las plantillas es que te permiten jugar un poco con el idioma, lo que puede ser genial, pero también causa muchos dolores de cabeza cuando quieres depurar algo. En general, las plantillas tienen sus buenas características, pero los genéricos me parecen más prácticos y limpios.
Ñame Marcovic
fuente
55
Y si aún desea un recolector de basura para C ++, puede descargar uno .
fredoverflow
3
vamos a continuar esta discusión en el chat
Yam Marcovic
66
Otra característica importante en C # en comparación con Java, por razones de rendimiento, es la "estructura", un tipo de objeto que puede almacenarse en la pila (o en registros de CPU, en casos especiales) o incrustarse en otros objetos de montón. A menudo se usan para objetos pequeños con 1-4 campos, como pares de coordenadas X, Y.
Qwertie
2
@LokiAstari ¿Me estás explicando? Mientras recuerde anular el registro de los controladores de eventos y usar el patrón Dispose en las clases que contienen envoltorios nativos, estará bien. Eso es mucho menos que saber y recordar que la administración de memoria en C ++.
Yam Marcovic
2
-1 ya que me faltan las secciones "C ++ es mejor que C # en eso ..." y "Java es mejor que C # ...". No creo que C # sea superior en todas las áreas, por lo que una respuesta sin estas dos secciones probablemente carezca de información importante.
Giorgio
30

El entorno

.NET Framework y clientes de Windows

Windows es el sistema operativo dominante en las computadoras cliente. Los mejores marcos de GUI para aplicaciones de Windows son Winforms y WPF junto con .NET Framework . El mejor lenguaje de programación para trabajar con .NET Framework y sus API es C # . Java no es una alternativa para esto. Y C ++ es un lenguaje antiguo sin administración automática de memoria. C # es similar a C ++ pero tiene administración de memoria automática y no tiene que trabajar con punteros, lo que lo hace más productivo. C ++ aún puede ser la mejor opción para algunos casos, pero no para aplicaciones de bases de datos de uso intensivo de formularios que son comunes en los negocios.

IIS y Windows Server

Si está acostumbrado a trabajar en el entorno de Windows y con C #, necesitará la menor inversión para aprender IIS para la programación del servidor y Windows Server para la administración básica.

Active Directory y Windows Server

Si está desarrollando un software que se implementará en las redes de la empresa, es probable que utilicen un entorno centrado en Windows utilizando un servidor de Windows con Active Directory. En dicho entorno, es fácil integrar e implementar una solución hecha en C # y .NET Framework .

Personalmente, soy un desarrollador de Java, no un desarrollador de C #, pero trabajo con la web. Cambiaría a C # si estuviera desarrollando aplicaciones de red para la red de Windows. Pero prefiero Java para servidores web basados ​​en Linux. Elegiría C ++ para sistemas embebidos donde no tendré muchas dependencias.

Sí, C # es un lenguaje mejor con características más modernas que C ++ y Java, pero eso no es lo más importante para elegir C # .

Resumen

El entorno para su software es más importante para elegir C # . Si trabaja en un entorno con clientes Windows, servidores Windows, Active Directory, IIS y tal vez SQL Server, entonces C # es el mejor lenguaje con .NET Framework .

Si trabaja en un entorno Unix con, por ejemplo, servicios web, Java sería mi elección. Y si trabaja con sistemas integrados o tiene que integrarse con dispositivos de hardware, C ++ sería una buena opción.

Jonas
fuente
3
Absolutamente, esta es la razón por la que uso C #, en realidad no es ninguna otra razón
Murph
Ciertamente puede usar .NET en otras plataformas a través de Mono, MonoTouch y MonoDroid, pero mis puntos de referencia encontraron que Mono es significativamente más lento que .NET para Windows, y el Marco Compacto de Microsoft es extremadamente lento en Windows CE: codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ... por supuesto, WPF solo está disponible en Windows (pero de todos modos no me gusta).
Qwertie
¿A qué dependencias se refiere? "Elegiría C ++ para sistemas embebidos donde no tendré muchas dependencias". ¿Te refieres a las bibliotecas de Java?
Puckl
@Puckl sí, pero principalmente jvm / jre.
Jonas
"Si trabaja en un entorno Unix con, por ejemplo, servicios web", hay otros lenguajes y marcos que podrían considerarse: ruby, Python, node.js, etc.
MarkJ
15

C # y Java

C # es un muy buen lenguaje si:

  • Desea hacer un desarrollo orientado a objetos de propósito general. Es un lenguaje OOP clásico y estáticamente tipado.
  • Se dirige solo a las plataformas de Microsoft (vale la pena recordar que Microsoft clonó efectivamente Java para crear C # porque querían un lenguaje similar a Java que encerraría a las personas en Windows. Podrían haber utilizado Java, pero eso habría permitido a las personas ejecutar fácilmente aplicaciones en otras plataformas ....)

C # como lenguaje es más agradable que Java en varias formas (mejor sintaxis para propiedades, tipos de valores, genéricos reificados, etc.). Prefiero C # como lenguaje a Java, pero en el gran esquema de las cosas son lenguajes bastante similares y adecuados para aplicaciones similares.

Por otro lado, Java también tiene algunas grandes ventajas:

  • Enorme ecosistema de código abierto: las bibliotecas para Java que puede obtener de forma gratuita son, con mucho, las mejores de cualquier lenguaje. Es difícil exagerar la importancia de esto: desde el punto de vista, Java es muy efectivo.
  • Herramientas: las herramientas de Java son, en mi opinión, mejores de lo que puede obtener el mundo .Net. Por ejemplo, Maven (¡una vez que lo hayas dominado!) es particularmente impresionante.
  • Mantenimiento: Java ha existido desde hace un tiempo y ha tenido éxito en las grandes empresas precisamente porque es relativamente estable y se ha realizado un gran esfuerzo para la compatibilidad con versiones anteriores. La sintaxis simple y ligeramente detallada también ayuda a Java aquí: es más fácil leer y mantener el código si el código es muy claro y explícito.
  • Nuevos lenguajes: la JVM tiene nuevos e increíbles lenguajes (Scala, Clojure, Groovy, etc.) que son el futuro de la plataforma Java. Aquí es donde está ocurriendo gran parte de la innovación del lenguaje, y está sucediendo mucho más rápido que en Java o C #.

Entonces, Java vs. C # es una decisión bastante estrecha y realmente se reduce a si quieres estar en el campamento de Microsoft o en el campo de código abierto / multiplataforma.

Personalmente, prefiero Java porque:

  • En mi opinión, el ecosistema de la biblioteca es mucho más importante que el hecho de que C # tenga una sintaxis mejor que Java
  • A la larga, quiero que todo mi código sea multiplataforma y pueda ejecutarse en grandes grupos de máquinas linux baratas en la nube.
  • Clojure es, en mi humilde opinión, el lenguaje más prometedor del mundo en este momento, y si me quedo con la plataforma JVM, podré pasar mi código y mis habilidades fácilmente a Clojure con el tiempo.

C / C ++

C / C ++ es básicamente una bestia completamente diferente. Yo no recomendaría a desarrollo de la aplicación de uso general hoy en día por las siguientes razones:

  • Administración de memoria: para la programación de propósito más general en la actualidad, no desea administrar su propia memoria. La recolección de basura en C # o Java es mucho mejor para su productividad y cordura que cualquiera de las técnicas explícitas de administración de memoria que tendrá que usar en C / C ++
  • Complejidad: C ++ en particular es un lenguaje extremadamente complejo. Se necesita mucho tiempo para dominar y el código en sí mismo también puede ser extremadamente complejo. (Las plantillas de C ++, por ejemplo, son particularmente peludas ...)
  • Productividad: la mayoría de las veces y si todo lo demás es igual, le llevará más tiempo hacer las cosas en C / C ++.

Sin embargo, es sin duda una gran opción en un cierto número limitado de dominios especiales, en particular:

  • Sistemas operativos: probablemente desee utilizar C / C ++ si está escribiendo un sistema operativo.
  • Desarrollo de juegos: casi todos los mejores motores de juegos comerciales son C / C ++. Sigue siendo la mejor opción si está desarrollando un título AAA exigente (C # y Java están perfectamente bien para juegos menos exigentes / casuales)
  • Computación de alto rendimiento: C / C ++ optimizado es probablemente la mejor manera de crear código de muy alto rendimiento. Para la mayoría de las aplicaciones, hacer este nivel de optimización no vale la pena, pero en ciertos dominios puede ser extremadamente valioso (comercio de alta frecuencia, por ejemplo)
  • Acceso al hardware: necesita acceso directo al hardware (por ejemplo, para un sistema integrado)

Básicamente, C / C ++ es una gran opción si y solo si está enfocado en uno de los dominios donde es particularmente adecuado.

mikera
fuente
1
Usted menciona a Maven como un ejemplo de mejores herramientas para Java. No estoy particularmente familiarizado con él, pero mirando la documentación, Maven se ve más similar a la herramienta de compilación nativa .Net MSBuild. ¿Qué hace a Maven mejor que MSBuild?
Kevin Cathcart
1
+! (solo porque solo tengo un voto): usted ha explicado muy bien por qué el ecosistema de Java es mejor y por qué no se debe comparar solo la sintaxis de C # con Java. Java tiene más y mejores bibliotecas y herramientas. No está sucediendo mucho en el lenguaje Java en sí, pero están apareciendo nuevos lenguajes muy interesantes para la JVM que son (IMO) mucho más interesantes que C #. No conozco Clojure pero encuentro Scala muy interesante: diseñado para ser OOP + FP desde el principio.
Giorgio
2
¿Por qué todos piensan que el código C ++ está lleno de administración manual de memoria? No es C, sabes, RAII significa que casi nunca tienes que asignar / liberar memoria manualmente (las veces que lo haces son aquellas en las que un lenguaje como C # sería inútil para ti).
gbjbaanb
3
@gbjbaanb: probablemente porque RAII es inadecuado para la administración de memoria de uso general. No es de ninguna manera equivalente en flexibilidad a un sistema GC completo como se ve en Java o C #. Tan pronto como supere los límites de RAII, volverá al territorio de administración de memoria manual.
mikera
3
@mikera Solo quiero señalar que también hay bastante desarrollo del lenguaje en la plataforma .NET. Por ejemplo, F # es un lenguaje funcional ordenado que integra sin problemas el resto de .NET, y Python fue portado recientemente a .NET como Iron Python (¡y también obtuvo un buen IDE !).
ikh
13
I heard that syntactically they are almost the same.

Sintácticamente? ¿Quién le da a los monos voladores la sintaxis? La sintaxis solo sirve para una cosa: permite una migración más rápida desde lenguajes sintácticamente similares. Eso es.

C # es mucho mejor que Java. Considere su soporte de programación genérico y funcional: C # está muy por delante de Java. Sin mencionar las sobrecargas del operador y otras cosas buenas: C # es mucho mejor presentado. No hay forma de que Java pueda considerarse mejor que C #.

C ++ y C # es más un concurso. C ++ tiene un modelo de compilación arcaico increíblemente molesto y un montón de enfermedades heredadas de C, pero sus plantillas son mucho más potentes que las genéricas, y sus enfoques de gestión de recursos son mucho más flexibles y potentes en general, como usinges un completo fracaso, y se ejecuta Más rápido.

DeadMG
fuente
66
Creo que uno debe comparar las características del idioma y la disponibilidad de un idioma en diferentes plataformas. Con C # one está bloqueado con Microsoft, con Java uno no: esa es una gran ventaja, al menos para los desarrolladores de UNIX / Linux. OOP + FP son características interesantes, pero ¿por qué preocuparse por C # si puede usar Scala, que se ejecuta en la JVM y puede interactuar con el código Java heredado? Nunca aprendería un lenguaje específico de plataforma a menos que me vea obligado a hacerlo.
Giorgio
2
@Giorgio: El proyecto Mono existe. Pero en segundo lugar, Microsoft realmente se encarga de su plataforma: le dan grandes actualizaciones regulares. Java apenas ha tenido nada nuevo. Además, la pregunta es sobre C # vs Java, no CLR vs JVM.
DeadMG
44
@DeadMG: Hasta donde yo sé, no puedo tomar ningún programa C # desarrollado en Windows y construirlo con Mono. No CLR vs JVM? La pregunta es por qué las personas usan C # o Java. Para que las personas utilicen un idioma necesitan un tiempo de ejecución y un sistema operativo. No discuto sobre el hecho de que C # tiene más características que Java, pero Java es mucho más portátil: este es un factor que puede influir en la adopción de un lenguaje. De hecho, Java todavía se usa con mucha más frecuencia que C #, incluso si carece de ciertas características avanzadas.
Giorgio
3
@Giorgio, que puede tomar cualquier programa en C # y construirlo con Mono. No puede usar ciertas bibliotecas (que de todos modos no son partes del lenguaje C #). Y Java no es "mucho más portátil". Puede codificar para iOS en C #, pero no en Java, por ejemplo.
SK-logic
2
@Giogio, Mono es al menos tan portátil como JVM.
SK-logic
7

Well C#tiene algunas características incorporadas agradables como LINQy delegados. Está obteniendo lo mejor de ambos mundos, Javay C++. Mira aquí para una comparación completa.

Pero me gusta más el Javamundo: mucho más marcos de código abierto y se ejecuta en todas las plataformas. Y no me hable de eso Mono, no es una opción confiable.

Petar Minchev
fuente
99
+1: "Pero me gusta más el mundo Java, mucho más frameworks de código abierto y se ejecuta en todas las plataformas". ¡Esperemos que Oracle no cambie esto!
Giorgio
15
Mente explicando, ¿qué no es "confiable" en Mono?
SK-logic
2
@Petar Minchev, no es más que culpa tuya. Debe seguir las pautas de portabilidad y no debe usar bibliotecas no portátiles, y de esta manera cualquier aplicación compleja se ejecutaría de manera confiable con Mono. Cosas como WPF nunca serán portadas.
SK-logic
2
@Petar Minchev, existen muchas bibliotecas Java no portátiles. Siempre debe tener cuidado con la portabilidad, sin importar el idioma que esté utilizando. Y de todos modos, la pregunta es sobre los idiomas, no las bibliotecas de terceros.
SK-logic
3
@Petar Minchev, GTK # es portátil. Úselo en su lugar.
SK-logic
3

Según algunas fuentes (véase, por ejemplo, http://www.indeed.com/jobtrends ) C # es aún menos popular que Java, y tan popular como C ++.

C # proporciona características de las que carece Java, por ejemplo, soporte directo para ciertos modismos de programación como propiedades, estilo de programación funcional, etc. C # tiene un mayor nivel de abstracción que C ++, lo cual es una ventaja cuando el tiempo de desarrollo es más importante que la velocidad del programa.

Personalmente, todavía prefiero los mundos Java / C ++. Como dijo Petar Minchev, Java tiene más frameworks y aplicaciones de código abierto, se ejecuta en todas partes, está menos vinculado a un proveedor y sistema operativo en particular. C ++ tiene ventajas similares, aunque el código a menudo necesita adaptaciones que van de una plataforma a otra. Como prefiero desarrollar en Linux y, que yo sepa, no puedo haber desarrollado completamente C # en Linux, nunca tuve un interés real en C # porque mis necesidades de programación están cubiertas por C, C ++, Java, Scala.

Por otro lado, para muchos desarrolladores estar vinculados a un proveedor en particular no es un problema: Microsoft tiene una posición dominante en el mercado de sistemas operativos y C # ofrece muchas oportunidades de trabajo. Por lo tanto, muchos desarrolladores de IMO adoptan C # porque, además de ser un lenguaje rico en funciones, también es una buena inversión.

Giorgio
fuente
"No puedo tener C # completamente desarrollado en Linux" - ¿Podrías dar más detalles sobre esto? ¿Quiere decir que el marco completo .Net no está disponible porque no me he encontrado con ningún problema con el lenguaje C # en sí (o F # para el caso) en Linux?
Wesley Wiser
@wawa: Que yo sepa, el marco .Net corresponde al JDK, y el marco .Net solo está disponible para Windows, mientras que el JDK está disponible para varios sistemas operativos. Si esto no es correcto, puedo editar mi respuesta (y también cambiar mi opinión).
Giorgio
1
Creo que una analogía más cercana sería la Biblioteca de clase base para el JDK. El BCL tiene piezas estandarizadas y no estandarizadas. El proyecto mono implementa tanto las piezas estandarizadas como las no estandarizadas.
Wesley Wiser
@wawa: Gracias por la información. Estoy considerando probar C # con Mono. Sin embargo, todavía tengo la fuerte sensación de que C # está mucho más vinculado a Microsoft que Java a Oracle (o a Sun en el pasado).
Giorgio
3

¿Qué pasa con "Qué marco de desarrollo de software, que incluye un lenguaje de programación" es mejor?

Olvidó incluir otras cosas, como el "entorno" con el que trabajará.

  1. ¿Va a funcionar solo para el sistema operativo Windows, pero no tiene que ser de bajo nivel y tener mucha memoria y otros recursos?

    Elija .NET como framework sobre Windows y use C #.

  2. ¿Vas a trabajar solo para Windows, pero no tiene que ser de bajo nivel, PERO, no tiene muchos recursos?

    Elija el Marco de Delphi (y el lenguaje de programación Object Pascal Delphi o el lenguaje de programación Lazarus Object Pascal)

  3. Es tu aplicación requerido para soportar varias plataformas, como un juego, en diferentes móviles?

    Elija el Marco de Java y el lenguaje de programación Java.

  4. ¿Es Linux con KDE como interfaz gráfica?

    Elija el marco QT, con C ++

  5. ¿Es Linux con Gnome como interfaz gráfica?

    Elija el marco GObject / GLib, con C ++

  6. ¿Vas a trabajar con muchas operaciones de bajo nivel, como desarrollar controladores?

    Plain C o C ++ se utiliza para varios sistemas operativos, con bibliotecas estándar, como marco.

Solo mis 2 centavos.

umlcat
fuente
1
No estoy seguro acerca de 3. Los teléfonos inteligentes son muy populares hoy y AFAIK, todos ellos admiten C # de alguna forma, pero solo Android es compatible con Java.
svick
¿No está muerta Delphi? :)
šljaker
@ šljaker No, pero no es muy popular en estos días.
umlcat
1
@svick: Eso es una mentira. Además de Android, Java también existe de alguna forma en iOS, Symbian, WinMo, Blackberry, Maemo y WebOS (es decir, todo lo que importa o aún importa; no me hagas empezar con plataformas aún más pequeñas). Android, Blackberry y Symbian admiten oficialmente Java como opción de desarrollo; Sun solía admitir Java en iOS incluso mientras que a Apple no le gusta. Java es el lenguaje de desarrollo principal en los teléfonos Android y Blackberry. No puedo decir lo mismo con C #, AFAICT solo es oficialmente compatible con WinMo.
Lie Ryan
1

Si realiza una búsqueda, es probable que se encuentre con discusiones sobre los principales lenguajes de programación. Este es uno de los resultados de búsqueda: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html . Java parece ser el lenguaje más popular.

Java trató de eliminar algunas de las deficiencias de C ++ (y simplificó la vida de los programadores para aplicaciones no críticas y en tiempo real). C #, que llegó tarde a la fiesta, evitó algunas de las deficiencias del lenguaje Java. C # ha progresado mucho (ya que Microsoft tiene mucho control sobre él), mientras que los avances en Java se bloquearon durante un período considerable de tiempo debido a un conflicto entre sus partes interesadas.

Satyajit
fuente
1

Un par de cosas que aún no se han mencionado:

C # es mejor que C ++ porque:

Elimina los archivos de encabezado, lo que se traduce en una gran simplicidad.

C # es mejor que Java porque:

Admite tipos definidos por el usuario tanto de tipo de referencia (clase) como de tipo de valor (estructura), que, si sabe lo que está haciendo, puede generar importantes beneficios de rendimiento.

Admite delegados, que son como interfaces de un solo método, lo que simplifica enormemente la codificación de construcciones que ocurren con frecuencia que involucran objetos de un solo método.

Mike Nakis
fuente
¿Puede explicar de qué manera tener ambos tipos de referencia y de tipo de valor puede generar beneficios de rendimiento en C #?
Giorgio el
Por ejemplo, si desea tener una matriz de registros, en Java no tiene más opción que describir su registro utilizando una clase, por lo que su matriz será una matriz de referencias a una multitud de objetos asignados por separado. En C # puede describir su registro utilizando una estructura, por lo que su matriz será solo un área continua de memoria que contiene sus estructuras una tras otra, tal como en C.
Mike Nakis
Como otro ejemplo, si desea definir un nuevo tipo pequeño (un tipo que se ajuste a una palabra de máquina), no tiene que definir una nueva clase para él; simplemente puede convertirlo en una estructura, por lo que obedecerá la semántica de valores. Pasar tales estructuras no será más costoso que pasar referencias a objetos, pero tendrá el beneficio de no asignar, construir y recolectar basura de ningún objeto.
Mike Nakis
Entiendo. Entonces, las clases se instancian en el montón y se accede a ellas a través de referencias, mientras que las estructuras se instancian en la pila (?)
Giorgio
Casi correcto. La única inexactitud en esta declaración es que se encontrará una estructura en el montón si está incrustada dentro de otro objeto, o si está dentro de una matriz de estructuras. Y también se encontrará en el montón si alguna vez se encuadra, exactamente de la misma manera que los tipos de valor se encuadran en Java.
Mike Nakis
1

Debe elegir el mejor idioma para su entorno esperado y su experiencia.

Elija C # si está trabajando en un entorno exclusivo de Microsoft. Si bien C # está estandarizado según ISO / IEC 23270: 2003, la versión de Microsoft sigue siendo la única implementación completa. Varias partes clave del lenguaje no están cubiertas por el estándar y, por lo tanto, están sujetas a las patentes de Microsoft. Nadie más implementará una versión completamente compatible del idioma para otros sistemas, por lo que, en efecto, está bloqueado por el proveedor de Microsoft Windows y .Net durante el tiempo que use el idioma. Si está buscando habilidades para usar en el mercado móvil, lo mejor es buscar otro idioma.

Java funciona, pero tiene una gran cantidad de gastos generales, en parte debido a características como la recolección de basura. Java tampoco está estandarizado por ISO / IEC, por lo que no tiene garantías si cambia las plataformas y versiones de Java, solo las mejores intenciones de Sun / Oracle. Si finalmente planea trabajar con Android, este es definitivamente el camino a seguir. La programación de Android es básicamente Java, con algunos cambios.

C ++ está estandarizado y casi todos los compiladores siguen el estándar internacional, por lo que tiene un comportamiento garantizado PERO el lenguaje no lo protege de usted mismo. Debe realizar la limpieza y la comprobación de desbordamiento por su cuenta. Esto no es dificil. Los programadores de C / C ++ han estado haciendo esto durante muchos años. Apple usa Objective C para todo, así que si quieres apuntar a Apple, te recomiendo que pruebes esto.

Si te ves dejando Windows en algún momento, te sugiero que aprendas tanto C / C ++ como Java, los cuales son comercializables en este momento.

TJ
fuente
0

En relación a C ++ vs C # (ya que no soy lo suficientemente competente en Java), lo que me falta aquí es la capacidad de acceder a cosas de bajo nivel en Windows. Por ejemplo, no puede desarrollar un controlador de pantalla nativo en C # (todavía), pero puede hacerlo con C ++. Esto no mejora C ++. Veo C ++ versus C # como ensamblado versus C.

C # es, en mi opinión, mucho más eficiente si nos fijamos en el tiempo que lleva implementar una característica. La penalización de rendimiento del tiempo de ejecución .Net es insignificante para el 99% de las aplicaciones desarrolladas. Puede ser importante si está ejecutando un ciclo cerrado, sí, por supuesto, pero la mayoría de las veces una aplicación está inactiva, esperando cualquier tipo de entrada, señal o interrupción (disco IO, clic de botón, red, finalización de animación) .

La biblioteca CLR con todas sus funciones tiene otro gran beneficio. Cuando estaba entrenando C # para desarrolladores junior, la mayoría de ellos dijeron que les gustaba la convención de nomenclatura lógica de clases, miembros y espacios de nombres. Encontrar una característica del método era lógico en todo el SDK, algo en lo que Visual Basic 5 tenía serias fallas. Esto les ha ayudado enormemente a adoptar la biblioteca. Después de aprender la sintaxis de un idioma, aprender una nueva biblioteca es importante para obtener una buena comprensión de cualquier SDK. Le evita reinventar la rueda.

Rob van der Veer
fuente