sharp - lenguaje c#
¿Cuáles son las principales diferencias entre C#y Java? (7)
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 lógica personalizada en sus captadores y configuradores.
Solo quiero aclarar una cosa. Esta no es una pregunta sobre cuál es mejor, esa parte la dejo para que otra persona 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 ocurrieron:
- 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 hace una nueva versión de Java, está disponible simultáneamente en todas las plataformas que admite, por otra parte, ¿cuántas funciones 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 soporta 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 de equipo sabrás a qué me refiero.
Por favor, agregue otros que considere relevantes.
Actualización: Me he dado cuenta de que Java no tiene atributos personalizados en clases, métodos, etc. ¿O no?
Características de C # Ausente en Java • C # incluye tipos más primitivos y la funcionalidad para detectar excepciones aritméticas.
• Incluye una gran cantidad de conveniencias 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 en sí.
• Permite la definición de "estructuras", que son similares a las clases pero que 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 instrucciones de conmutación operen en cadenas.
• C # permite métodos anónimos que brindan funcionalidad de cierre.
• C # permite iterador que emplea co-rutinas a través de una palabra clave de rendimiento de estilo funcional.
• C # es compatible con los parámetros de salida, ayudando en el retorno de múltiples valores, una característica compartida por C ++ y SQL.
• C # tiene la capacidad de alias 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 le permite también implementar dos interfaces diferentes que tienen un método del 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 strictfp de Java garantiza que el resultado de las operaciones de punto flotante permanezca igual en todas las plataformas.
• Java admite excepciones comprobadas para una mejor aplicación de la captura y el manejo de errores.
Genéricos:
Con los genéricos de Java, en realidad no obtiene la eficiencia de ejecución que obtiene con .NET porque cuando compila una clase genérica en Java, el compilador elimina el parámetro de tipo y sustituye a Objeto en todas partes. Por ejemplo, si tiene una clase Foo<T>
, el compilador java genera Byte Code como si fuera Foo<Object>
. Esto significa que el casting y también el boxeo / 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 idioma son, como usted señaló, delegados.
La siguiente es una gran referencia en profundidad de Dare Obasanjo sobre las diferencias entre C # y Java. Siempre me estoy refiriendo a este artículo al cambiar entre los dos.
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.
Acerca de los atributos, Java tiene anotaciones, que funcionan casi de la misma manera.
Vaya al enlace que se encuentra a continuación msdn.microsoft.com/en-us/library/ms836794.aspx Cubre la similitud y la diferencia entre C # y java
Comparando Java 7 y C # 3
(Algunas características de Java 7 no se mencionan aquí, pero se ha eliminado la ventaja de using
de todas las versiones de C # sobre Java 1-6).
No todo su resumen es correcto:
- En Java, los métodos son virtuales por defecto, pero puedes hacerlos definitivos. (En C # están sellados de forma predeterminada, pero puede hacer que sean 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 eso). En C # y .NET, los genéricos también se mantienen en el momento de la ejecución, y funcionan para tipos de valor así como para tipos de referencia, manteniendo la eficiencia adecuada (por ejemplo, una
List<byte>
comobyte[]
respaldándola, en lugar de una matriz de bytes en caja .) - C # no tiene excepciones verificadas
- Java no permite la creación de tipos de valores definidos por el usuario
- Java no tiene sobrecarga de conversión y operador
- Java no tiene bloques de 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 parecido a métodos anónimos y expresiones lambda. Las clases internas anónimas por lo general llenan estos roles, pero de forma insulsa.
- Java no tiene árboles de expresión
- C # no tiene clases internas anónimas
- C # no tiene clases internas de Java, de hecho, todas las clases anidadas en C # son como las clases anidadas de Java
- Java no tiene clases estáticas (que no tienen constructores de instancias y no se pueden usar para variables, parámetros, etc.)
- Java no tiene ningún equivalente a los tipos anónimos de C # 3.0
- Java no tiene variables locales implícitamente escritas
- Java no tiene métodos de extensión.
- Java no tiene expresiones de inicialización de objetos y colecciones.
- Los modificadores de acceso son algo diferentes: en Java (actualmente) no hay un equivalente directo de un ensamblaje, así 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 de código "inseguro"
- La interoperabilidad es más fácil en C # (y .NET en general) que en JNI de Java
- Java y C # tienen ideas algo diferentes de enumeraciones. Los de Java son mucho más orientados a objetos.
- Java no tiene directivas de preprocesador (#define, #if etc en C #).
- Java no tiene un equivalente de la
ref
yout
de C # 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 hay soporte de idioma)
- Java no tiene equivalentes 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.