Pregunta Los desarrolladores de C # aprendiendo Java, ¿cuáles son las mayores diferencias que uno puede pasar por alto? [cerrado]


Para los desarrolladores de c # que están mirando para aprender Java, ¿hay grandes diferencias subyacentes entre los dos idiomas que se deben señalar?

Tal vez algunas personas pueden asumir que las cosas son iguales, pero hay algunos aspectos de importación que no deben pasarse por alto. (¡o realmente puedes arruinar!)

Tal vez en términos de construcciones OOP, la forma en que GC funciona, referencias, implementación relacionada, etc.


74
2018-01-06 17:07


origen


Respuestas:


Algunas tonterías fuera de mi cabeza:

  • Java no tiene tipos de valores personalizados (estructuras), así que no se moleste en buscarlos
  • Las enumeraciones Java son muy diferentes al enfoque de "números nombrados" de C #; son más OO. Se pueden usar con gran efecto, si tienes cuidado.
  • byte está firmado en Java (por desgracia)
  • En C #, se ejecutan inicializadores de variable de instancia antes de el constructor de la clase base lo hace; en Java corren después lo hace (es decir, justo antes del cuerpo constructor en "esta" clase)
  • En C # los métodos están sellados por defecto. En Java son virtuales por defecto.
  • El modificador de acceso predeterminado en C # es siempre "el acceso más restrictivo disponible en el contexto actual"; en Java es el acceso "paquete". (Vale la pena leer sobre los modificadores de acceso particulares en Java).
  • Los tipos anidados en Java y C # funcionan de forma algo diferente; en particular, tienen diferentes restricciones de acceso, y a menos que declare que el tipo anidado es static tendrá una referencia implícita a una instancia de la clase contenedora.

106
2018-01-06 17:13



aquí hay una comparación muy completa de los 2 idiomas:

http://www.25hoursaday.com/CsharpVsJava.html

Adicional: http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp


20
2018-01-06 17:13



Me sorprende que nadie haya mencionado propiedades, algo fundamental en C # pero ausente en Java. C # 3 y superior también ha implementado propiedades automáticamente. En Java, debe usar métodos de tipo GetX / SetX.

Otra diferencia obvia es LINQ y expresiones lambda en C # 3 ausentes en Java.

Hay algunas otras cosas simples pero útiles que faltan en Java, como las cadenas verbatim (@ ""), la sobrecarga del operador, los iteradores que usan rendimiento y el preprocesador también faltan en Java.

Uno de mis favoritos personales en C # es que los nombres de espacios de nombres no tienen que seguir la estructura física del directorio. Realmente me gusta esta flexibilidad.


16
2018-01-06 20:37



Hay muchas diferencias, pero me vienen a la mente:

  • La falta de sobrecarga del operador en Java. Mire su instancia. Iguales (instancia2) contra instancia == instancia2 (especialmente con cadenas).
  • Acostúmbrate a que las interfaces NO tengan el prefijo I. A menudo ves espacios de nombres o clases con el sufijo Impl.
  • El bloqueo comprobado doble no funciona debido al modelo de memoria de Java.
  • Puede importar métodos estáticos sin agregarles el nombre de clase, lo cual es muy útil en ciertos casos (DSL).
  • Las instrucciones de cambio en Java no requieren un valor predeterminado, y no puede usar cadenas como etiquetas de caso (IIRC).
  • Los genéricos de Java te enojarán. Los genéricos de Java no existen en tiempo de ejecución (al menos en 1.5), son un truco de compilación, que causa problemas si desea hacer una reflexión sobre los tipos genéricos.

10
2018-01-06 19:39



.NET ha reificado genéricos; Java ha borrado genéricos.

La diferencia es esta: si tienes un ArrayList<String> objeto, en .NET, puede decir (en tiempo de ejecución) que el objeto tiene tipo ArrayList<String>, mientras que en Java, en tiempo de ejecución, el objeto es de tipo ArrayList; el String parte está perdida Si pone en no-String objetos en el ArrayList, el sistema no puede hacer cumplir eso, y solo lo sabrá después de intentar extraer el elemento, y el molde falla.


8
2018-01-06 17:20



Una cosa que echo de menos en C # de Java es el manejo forzado de las excepciones marcadas. En C # es muy común que uno ignore las excepciones que un método puede arrojar y usted está a merced de la documentación o las pruebas para descubrirlas. No ocurre lo mismo en Java con excepciones marcadas.


6
2018-01-06 17:42



Sin delegados ni eventos: debe usar interfaces. Afortunadamente, puedes crear clases e implementaciones de interfaz en línea, así que esto no es tan importante


4
2018-01-06 17:16



Java tiene autoboxing para primitivas en lugar de tipos de valores, por lo que aunque System.Int32[] es una matriz de valores en C #, Integer[] es una serie de referencias a Integer objetos, y como tal no aptos para cálculos de mayor rendimiento.


4
2018-01-06 18:43



La funcionalidad incorporada de fecha / calendario en Java es horrible en comparación con System.DateTime. Hay mucha información sobre esto aquí: ¿Qué pasa con Java Date & Time API?

Algunos de estos pueden ser problemas para un desarrollador de C #:

  • La clase Java Date es mutable, lo que puede hacer que regresar y pasar fechas sean peligrosas.
  • La mayoría de los constructores de java.util.Date están en desuso. Simplemente instanciar una fecha es bastante detallado.
  • Nunca he recibido la clase java.util.Date para interoperar bien con los servicios web. En la mayoría de los casos, las fechas de cada lado se transformaron salvajemente en alguna otra fecha y hora.

Además, Java no tiene todas las mismas características que el GAC y los ensamblados fuertemente nombrados. Jar Hell es el término que puede fallar al vincular / referenciar bibliotecas externas.

En lo que se refiere al empaque / despliegue:

  • puede ser difícil empaquetar aplicaciones web en un formato EAR / WAR que realmente se instala y ejecuta en varios servidores de aplicaciones diferentes (Glassfish, Websphere, etc.).
  • implementar su aplicación Java como un servicio de Windows requiere mucho más esfuerzo que en C #. La mayoría de las recomendaciones que obtuve para esto involucraban una biblioteca de terceros no libre
  • la configuración de la aplicación no es tan fácil como incluir un archivo app.config en su proyecto. Hay una clase java.util.Properties, pero no es tan robusta y encontrar el lugar adecuado para soltar tu archivo .properties puede ser confuso

2
2018-01-06 20:10