¿Cuáles son las principales diferencias entre C # y Java?

209

Solo quiero aclarar una cosa. Esta no es una pregunta sobre cuál es mejor, esa parte se la dejo a otra persona para que la discuta. No me importa Me hicieron esta pregunta en mi entrevista de trabajo y pensé que podría ser útil aprender un poco más.

Estos son los que se me ocurren:

  • Java es "plataforma independiente". Bueno, hoy en día se podría decir que existe el proyecto Mono , por lo que C # también podría considerarse, pero creo que es un poco exagerado. ¿Por qué? Bueno, cuando se realiza una nueva versión de Java, está disponible simultáneamente en todas las plataformas que admite, por otro lado, ¿cuántas características de C # 3.0 aún faltan en la implementación de Mono? ¿O es realmente CLR vs. JRE que deberíamos comparar aquí?
  • Java no admite eventos y delegados. Por lo que sé.
  • En Java todos los métodos son virtuales.
  • Herramientas de desarrollo: creo que todavía no existe una herramienta como Visual Studio. Especialmente si has trabajado con ediciones en equipo, sabrás a qué me refiero.

Por favor agregue otros que considere relevantes.

Actualización: Acabo de aparecer en mi mente, Java no tiene algo como atributos personalizados en clases, métodos, etc. ¿O sí?

Enes
fuente
1
Los idiomas son diferentes de las implementaciones de idiomas, que también son diferentes de las bibliotecas. ¿Qué intentas comparar?
Miguel Ping
2
Encontré este msdn.microsoft.com/en-us/library/ms836794.aspx Cubre tanto la similitud como la diferencia entre C # y java.
Bipul
1
Puede obtener muchas de las cosas mencionadas a continuación sobre Java con las bibliotecas correctas. Compruebe, por ejemplo, este código Java válido: nueva Cadena [] {"james", "john", "john", "eddie"} .where (comienza con ("j")). Distinct (); Utiliza una biblioteca llamada lombok-pg. Se puede encontrar en github.com/nicholas22/jpropel
NT_

Respuestas:

329

Comparando Java 7 y C # 3

(Algunas características de Java 7 no se mencionan aquí, pero la usingventaja de la declaración de todas las versiones de C # sobre Java 1-6 se ha eliminado).

No todo su resumen es correcto:

  • En Java, los métodos son virtuales de forma predeterminada, pero puede hacerlos finales. (En C # están sellados de forma predeterminada, pero puede hacerlos virtuales).
  • Hay muchos IDE para Java, tanto gratuitos (por ejemplo, Eclipse, Netbeans) como comerciales (por ejemplo, IntelliJ IDEA)

Más allá de eso (y lo que ya está en su resumen):

  • Los genéricos son completamente diferentes entre los dos; Los genéricos de Java son solo un "truco" en tiempo de compilación (pero útil). En C # y .NET, los genéricos también se mantienen en tiempo de ejecución y funcionan para los tipos de valor y los tipos de referencia, manteniendo la eficiencia adecuada (por ejemplo, a List<byte>como abyte[] respaldo, en lugar de una matriz de bytes en caja).
  • C # no tiene excepciones marcadas
  • Java no permite la creación de tipos de valores definidos por el usuario
  • Java no tiene sobrecarga de operador y conversión
  • Java no tiene bloques iteradores para la implementación simple de iteradores
  • Java no tiene nada como LINQ
  • En parte debido a que no tiene delegados, Java no tiene nada como métodos anónimos y expresiones lambda. Las clases internas anónimas usualmente cumplen estos roles, pero de manera poco convincente.
  • Java no tiene árboles de expresión
  • C # no tiene clases internas anónimas
  • C # no tiene las clases internas de Java, de hecho, todas las clases anidadas en C # son como las clases anidadas estáticas de Java
  • Java no tiene clases estáticas (que no tienen ningún constructor de instancias y no se pueden usar para variables, parámetros, etc.)
  • Java no tiene ningún equivalente a los tipos anónimos C # 3.0
  • Java no tiene variables locales escritas implícitamente
  • Java no tiene métodos de extensión
  • Java no tiene expresiones de inicializador de objeto y colección
  • Los modificadores de acceso son algo diferentes: en Java no existe (actualmente) un equivalente directo de un ensamblado, por lo que no hay idea de visibilidad "interna"; en C # no hay equivalente a la visibilidad "predeterminada" en Java que tiene en cuenta el espacio de nombres (y la herencia)
  • El orden de inicialización en Java y C # es sutilmente diferente (C # ejecuta inicializadores variables antes de la llamada encadenada al constructor del tipo base)
  • Java no tiene propiedades como parte del lenguaje; son una convención de métodos get / set / is
  • Java no tiene el equivalente del código "inseguro"
  • La interoperabilidad es más fácil en C # (y .NET en general) que JNI de Java
  • Java y C # tienen ideas algo diferentes de enumeraciones. Los Java están mucho más orientados a objetos.
  • Java no tiene directivas de preprocesador (#define, #if etc. en C #).
  • Java no tiene equivalente de C # refyout para pasar parámetros por referencia
  • Java no tiene equivalente de tipos parciales
  • Las interfaces de C # no pueden declarar campos
  • Java no tiene tipos enteros sin signo
  • Java no tiene soporte de idioma para un tipo decimal. (java.math.BigDecimal proporciona algo como System.Decimal, con diferencias, pero no admite idiomas)
  • Java no tiene equivalente de tipos de valores anulables
  • El boxeo en Java utiliza tipos de referencia predefinidos (pero "normales") con operaciones particulares en ellos. El boxeo en C # y .NET es un asunto más transparente, con un tipo de referencia creado para el boxeo por el CLR para cualquier tipo de valor.

Esto no es exhaustivo, pero cubre todo lo que se me ocurre.

Jon Skeet
fuente
24
@Brian: Creo que los genéricos de Java y los detalles de las clases internas anulan rápidamente la idea de que Java logre la superioridad mediante la simplicidad;)
Jon Skeet
8
@OrangeDog: personas que argumentan que se están engañando a sí mismas, en mi opinión. Es difícil ver cómo ser forzado a escribir un bloque explícito de prueba / finalmente es menos propenso a errores que una declaración de uso, IMO. La mayoría de las características "adicionales" de C # en comparación con Java significan que puede salirse con la suya escribiendo menos código, y que ese código puede ser más legible.
Jon Skeet
17
@OrangeDog: ¿Qué tan imparcial eres, sin interés? Sí, soy un entusiasta de C #, pero también tengo una experiencia bastante significativa en Java: después de todo, es mi trabajo diario. No es que ignore cómo usar Java de manera efectiva.
Jon Skeet
8
@OrangeDog: Para empezar, la mayoría de los desarrolladores no escriben código usando "inseguro" hasta donde yo sé, por lo que es una pista falsa. También creo que la capacidad de prueba es una pista falsa: no creo que la capacidad de prueba formal tenga mucho que ver con lo fácil que es para un ser humano razonar sobre el código. Mi punto es que, como alguien con bastante experiencia tanto en Java como en C #, considero que C # es un lenguaje muy superior en términos de productividad y legibilidad. Si siente lo contrario, ¿podría aclarar sus niveles de experiencia en ambos idiomas? Creo que es bastante relevante para la discusión.
Jon Skeet
21
@OrangeDog: Además, su afirmación de que "Ser capaz de hacer más cosas aumenta la probabilidad de que las haga mal" también es una falacia de la OMI ... porque supone que si no puede hacer algo con una función de lenguaje que lo hace fácil, no tendrá que hacerlo en absoluto. Eso simplemente no es cierto: a menudo las tareas que debe realizar en Java y C # son las mismas, pero debido a la falta de características, Java hace que sea más difícil realizar esas tareas correctamente. Al simplificar la tarea, la función disminuye la probabilidad de que lo haga mal.
Jon Skeet
24

La siguiente es una gran referencia en profundidad de Dare Obasanjo sobre las diferencias entre C # y Java. Siempre me encuentro refiriéndome a este artículo cuando cambio entre los dos.

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

Winston Smith
fuente
2
@ Jon Skeet: eres el desarrollador más activo de C #. ¿Por qué no mantiene su versión de C # y las diferencias de Java? Apuesto a que a la gente le encantaría leerlo.
garras el
1
@claws: no tengo tiempo para hacer todo lo que me gustaría.
Jon Skeet
19
@ Winston: Necesitamos una lista de "diferencias entre Chuck Norris y Jon Skeet": 1) Chuck Norris siempre tiene tiempo; Jon debe modificar la TimeDateclase para tener siempre tiempo, y aún no ha tenido tiempo de hacerlo :(
RedFilter
11

C # tiene propiedades automáticas que son increíblemente convenientes y también ayudan a mantener su código más limpio, al menos cuando no tiene una lógica personalizada en sus captadores y definidores.

Morten Christiansen
fuente
10

Características de C # ausentes en Java • C # incluye tipos más primitivos y la funcionalidad para capturar excepciones aritméticas.

• Incluye una gran cantidad de convenciones de notación sobre Java, muchas de las cuales, como la sobrecarga de operadores y las conversiones definidas por el usuario, ya son familiares para la gran comunidad de programadores de C ++.

• El manejo de eventos es un "ciudadano de primera clase", es parte del lenguaje mismo.

• Permite la definición de "estructuras", que son similares a las clases pero pueden asignarse en la pila (a diferencia de las instancias de clases en C # y Java).

• C # implementa propiedades como parte de la sintaxis del lenguaje.

• C # permite que las declaraciones de cambio operen en cadenas.

• C # permite métodos anónimos que proporcionan funcionalidad de cierre.

• C # permite un iterador que emplea co-rutinas a través de una palabra clave de rendimiento de estilo funcional.

• C # tiene soporte para parámetros de salida, lo que ayuda en el retorno de múltiples valores, una característica compartida por C ++ y SQL.

• C # tiene la capacidad de alias de espacios de nombres.

• C # tiene "Implementación explícita de miembros" que permite a una clase implementar específicamente métodos de una interfaz, separados de sus propios métodos de clase. Esto también le permite implementar dos interfaces diferentes que tienen un método con el mismo nombre. Los métodos de una interfaz no necesitan ser públicos; se puede hacer que sean accesibles solo a través de esa interfaz.

• C # proporciona integración con COM.

• Siguiendo el ejemplo de C y C ++, C # permite la llamada por referencia para tipos primitivos y de referencia.

Características de Java ausente en C #

• La palabra clave strictlyfp de Java garantiza que el resultado de las operaciones de coma flotante permanezca igual en todas las plataformas.

• Java admite excepciones comprobadas para una mejor aplicación de la captura y el manejo de errores.

Abhishek kumar
fuente
9

Otro buen recurso es http://www.javacamp.org/javavscsharp/ Este sitio enumera muchos ejemplos que ilustran casi todas las diferencias entre estos dos lenguajes de programación.

Sobre los atributos, Java tiene anotaciones, que funcionan casi de la misma manera.

Rafael Romão
fuente
5

Genéricos:

Con los genéricos de Java, en realidad no obtienes nada de la eficiencia de ejecución que obtienes con .NET porque cuando compilas una clase genérica en Java, el compilador quita el parámetro de tipo y sustituye Object en todas partes. Por ejemplo, si tiene una Foo<T>clase, el compilador de Java genera código de bytes como si fueraFoo<Object> . Esto significa que la conversión y el boxing / unboxing deberán realizarse en el "fondo".

He estado jugando con Java / C # por un tiempo y, en mi opinión, la principal diferencia a nivel de lenguaje son, como usted señaló, los delegados.

bruno conde
fuente
Esto está mal, el borrado genérico o la reificación (Java y C # respectivamente) no necesariamente afectan el rendimiento.
Miguel Ping
Estás confundiendo autoboxing con casting.
JesperE
3
No, Bruno tiene razón sobre la diferencia de rendimiento. No hay forma de obtener el equivalente de una Lista <byte> (genéricamente) en Java. Tendría que tener una Lista <Byte> que incurriría en penalizaciones de boxeo (tiempo y memoria).
Jon Skeet
El (des) boxeo solo ocurre para los tipos en caja, que son tipos primitivos.
Miguel Ping
1
Consulte este artículo: jprl.com/Blog/archive/development/2007/Aug-31.html
bruno conde
0

Visite el enlace que figura a continuación msdn.microsoft.com/en-us/library/ms836794.aspx Cubre tanto la similitud como la diferencia entre C # y java

Kanwar Singh
fuente