Por último, para terminar con esta introducción a la plataforma .NET, una comparación recurrente cuando se habla de .NET, ya sea hablando de la implementación de Microsoft, o de Mono. Muchos desarrolladores preguntan la necesidad de definir una nueva tecnología o incluso un nuevo lenguaje, cuando en definitiva Java realiza cosas similares.
A continuación se intenta explicar estas diferencias pero partiendo de la base de que ambas tecnologías son compatibles. .NET es una tecnología más en el mundo de desarrollo, que ofrece nuevas posibilidades a los desarrolladores, pero cuyo objetivo no es eliminar a Java, lo cual por otra parte, sería imposible debido a la gran cantidad de código escrito para esta plataforma.
Es importante tener en cuenta que .NET no es algo 100% novedoso, es básicamente una reunión de tecnologías muy interesantes, e integradas de forma eficaz, eficiente y elegante. La mayoría de estas tecnologías existían ya, al igual que también existían desde hacía mucho tiempo las tecnologías implementadas en Java.
Plataformas
|| || Java || .NET || || Java funciona sobre un gran número de plataformas || .NET funciona en Windows con la implementación de .NET de Microsoft y en Linux, FreeBSD y Windows con la implementación de Mono, aunque se prevé dar soporte a más plataformas || || J2EE || J2EE y .NET ofrecen básicamente las mismas funcionalidades, aunque de diferente forma. || || Java no permite la interoperabilidad de múltiples lenguajes. Es posible compilar a bytecode desde múltiples lenguajes, pero no es posible alcanzar el nivel de interacción que se da en .NET || .NET permite desarrollar en diferentes lenguajes y que el código generado sea completamente utilizable desde otras aplicaciones en otros lenguajes. || || Java no permite la intercomunicación entre aplicaciones de una forma tan sencilla como en .NET || .NET utiliza SOAP (XML+http) para comunicar aplicaciones. Esto permite comunicar aplicaciones hechas en cualquier tecnología o plataforma con otras. || ||
C# vs Java
En lo que respecta a las diferencias entre estos lenguajes, hay que decir que prácticamente todo lo que se puede hacer en C# se puede hacer en Java. C# ofrece un conjunto de construcciones que permiten facilitar la vida al desarrollador, aunque estos constructores se pueden simular también en Java. Sin embargo la forma de hacer este tipo de cosas es más consistente y sencillo en C#, aunque con el “incoveniente” de tener que tener que conocer un número mayor de contructores que en Java.
Java utiliza una filosofía, de si algo se puede hacer con clases, no es necesario crear un constructor específico. Java mejoró en muchos aspectos C++, como por ejemplo con la eliminación de punteros, archivos header, o la existencia de una clase base común. Una característica de estas simplificaciones es que hacen el desarrollo más sencillo, pero el no utilizar algunos de los constructores que se ven a continuación, puede provocar que el desarrollo sea más complejo y el código menos claro.
|| || Java || C# || || Java no dispone de un constructor de propiedades. Los atributos de las clases se modifican mediante métodos set* y get*, aunque el lenguaje no obliga e ello. || C# dispone de propiedades, un patrón muy utilizado sobretodo en entornos RAD. || || Java no dispone de Indexers || En C# se permite el manejo de una clase como si fuera un array. || || Java no dispone de delegados || Un delegado en .NET se puede ver como una manera segura de utilizar punteros a funciones. Un delegado puede contener también llamadas a más de un método, de forma que es muy sencillo implementar el patrón observer, el cual se utiliza con profusión en la programación basada en eventos por ejemplo. || || Java no soporta eventos || C# da soporte al uso directo de eventos. Aunque la utilización de eventos en la programación actual es algo muy habitual, no se ha realizado demasiado esfuerzo en simplificar su manejo. C# utiliza delegados y la palabra clave event para ofrecer un modo sencillo de gestionar eventos. || || Java no soporta enumerados. Para ello se utilizan clases con constantes numéricas (final static). Esto puede ser una fuente de problemas en el sentido en que no se garantiza del todo la seguridad de tipos. || C# soporta enumerados. Los enumerados permiten especificar grupos de elementos de una forma sencilla y segura, por ejemplo, los días de la semana. || || Java no contempla el constructor foreach para recorrer colecciones. || C# permite la utilización del constructor foreach para recorrer todas aquellas colecciones de elementos que cumplan un determinado interfaz. || || Por defecto en Java todos los métodos son virtuales. || En C# hay que indicar qué métodos se desea que sean virtuales con la palabra reservada virtual, e indicar los métodos sobrecargados con la palabra override. || || Java tiene información de los datos en el código, pero a un nivel muy inferior al de C#. Utiliza / */ y @tag para incluir información sobre el código, aunque esta información no se pasa al bytecode. || C# utiliza atributos para cualificar métodos, atributos, clases… con el fin de pasar información al runtime y que esté disponible en tiempo de ejecución. Hay un conjunto de atributos disponibles, aunque se pueden crear específicos. Podemos utilizar atributos para especificar cómo se debe serializar una clase en XML, o qué evento de un componente es al que una herramienta RAD debería asociar una acción por defecto, al hacer el usuario doble clic en el componente. || || En Java una aplicación se divide en paquetes, cuya estructura jerárquica debe coincidir con la estructura de carpetas que forman el proyecto. || En C# el código se organiza en archivos, namespaces y assemblies. Los namespaces permiten agrupar clases de forma que se eviten conflictos de nombres. Los assemblies son los .dll o .exe que se generan al compilar un conjunto de archivos. Un assembly puede contener un número indeterminado de namespaces, y un namespace puede estar repartido entre varios assemblies. Los archivos que forman un assembly o un namespace, no tienen ninguna limitación en cuanto a su ubicación en carpetas, ya que los namespaces en un concepto únicamente lógico. || || Java no permite trabajar con punteros || C# permite trabajar con punteros. Para ello es necesario marcar la zona dónde se manejan dentro de una construcción unsafe, y compilar el código con el flag unsafe. || ||