Estos días he estado ayudando a algunos amigos que están acostumbrados a trabajar en Java a hacer unas prácticas en C#. Mucha gente dice que C# “es como Java”, pero me parece que es una mentira bastante gorda. Uno puede hacer código C# como si de Java se tratase, sí… pero quedaría “raro” y farragoso.
Pongamos un ejemplo, imaginemos que tenemos una clase persona que almacena Nombre, Edad y Lugar de nacimiento. En Java estaríamos hablando de esto:
public class Persona {
private String nombre;
private int edad;
private String lugarNacimiento;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
public String getLugarNacimiento() {
return lugarNacimiento;
}
public void setLugarNacimiento(String lugarNacimiento) {
this.lugarNacimiento = lugarNacimiento;
}
}
En C# el código se simplifica bastante:
public class Persona
{
public string Nombre { get; set; }
public int Edad { get; set; }
public string LugarDeNacimiento { get; set; }
}
A simple vista el código de C# es más sencillo, pero sigamos con el ejemplo. Creemos una lista de objetos persona. La lista tendrá 5 personas. En Java:
ArrayList lista = new ArrayList();
Persona carlos = new Persona();
carlos.setNombre("Carlos");
carlos.setEdad(20);
carlos.setLugarNacimiento("Madrid");
Persona pablo = new Persona();
pablo.setNombre("Pablo");
pablo.setEdad(22);
pablo.setLugarNacimiento("Gijón");
Persona manolo = new Persona();
manolo.setNombre("Manolo");
manolo.setEdad(46);
manolo.setLugarNacimiento("Lugo");
Persona pedro = new Persona();
pedro.setNombre("Pedro");
pedro.setEdad(33);
pedro.setLugarNacimiento("Crevillente");
Persona alejandro = new Persona();
alejandro.setNombre("Alejandro");
alejandro.setEdad(27);
alejandro.setLugarNacimiento("Cuenca");
lista.add(carlos);
lista.add(pablo);
lista.add(manolo);
lista.add(pedro);
lista.add(alejandro);
Ahora en C#:
Persona carlos = new Persona() { Nombre = "Carlos", Edad = 20, LugarDeNacimiento = "Madrid" };
Persona pablo = new Persona() { Nombre = "Pablo", Edad = 22, LugarDeNacimiento = "Gijón" };
Persona manolo = new Persona() { Nombre = "Manolo", Edad = 46, LugarDeNacimiento = "Lugo" };
Persona pedro = new Persona() { Nombre = "Pedro", Edad = 33, LugarDeNacimiento = "Crevillente" };
Persona alejandro = new Persona() { Nombre = "Alejandro", Edad = 27, LugarDeNacimiento = "Cuenca" };
List lista = new List() { carlos, pablo, pedro, alejandro };
No sé a vosotros, pero a mí al menos me parece mucho más claro y cómodo C#. En cualquier caso, sigamos. Nos interesa listar todas las personas que tengan más de 25 años y hayan nacido en una ciudad que contenga la letra ‘e’. Además, queremos la lista por orden alfabético.
Veamos cómo se las arregla Java:
private ArrayList ordenarYFiltrar(ArrayList lista) {
ArrayList aux = new ArrayList();
for (int i = 0; i < lista.size(); i++) {
if(lista.get(i).getLugarNacimiento().contains("e") && lista.get(i).getEdad() > 25)
insertaEnPosicion(aux, lista.get(i));
}
return aux;
}
private void insertaEnPosicion(ArrayList aux, Persona persona) {
for (int i = 0; i < aux.size(); i++) {
String actual = aux.get(i).getNombre();
if (actual.compareTo(persona.getNombre()) > 0) {
aux.add(i, persona);
return;
}
}
aux.add(persona);
}
[...]
lista = ordenarYFiltrar(lista);
for(Persona persona : lista)
System.out.println(persona.getNombre());
[...]
Ahora veamos cómo sería eso en C#:
lista = (from persona in lista where persona.Edad > 25 && persona.Nombre.Contains('e') orderby persona.Nombre ascending select persona).ToList();
lista.ForEach(x => Console.WriteLine(x.Nombre));
No me parece que se pueda decir que C# es igual que Java ni que tengan la misma productividad…
Java es una caca. Tengo examen dentro de 2 horas y me estoy cagando en toda la junta directiva de Sun.
De todas formas, aunque claramente se puede ver que C# tiene una sintaxis más clara, Java tiene dos cosas que jamas tendrá C#:
1.- Muchos empezamos con Java y tenemos que usarlo a diario con lo que le tenemos un «cariño» especial, y no nos dejan ni de lejos ver otro lenguaje… Sigo diciendo que eran risas empezar la carrera con Lisp.
2.- Jamas tendrá Swing el genial y fantástico Swing, oh Swing te adoramos, eres perfecto, rápido, simple. Eres mejor y todo que GTK# hoyga! Chupate esa QT4! Swing ftw!
Notese el sarcasmo.
A ver, varias cosas:
1) Java no es una caca como dice algún comentario. Es un gran lenguaje, otra cosas es que ya se algo viejo y no admita algunas cosas que lenguajes más modernos pueden asimilar menos traumáticamente.
2) Lo siento Pablo, pero los dos primeros ejempos que has puesto no se diferencian en nada, son sólo azucar sintáctico que generan un bytecode (cli) casi idéntico.
3) El tercer ejemplo ya es diferente: las collecciones, genéricos, etc están mucho mejor en .NET
Y más cosas…, pero en fin, no es cosa de soltar un monólogo aqui xD
Quizas tienes razón, yo he pasado por esa experiencia de tener que interactuar con ambos lenguajes de programacion y, a pesar de que he escuchado decir q son lenguajes parecidos, es falso… hay q recordar que csharp es practicamene java con un conjunto de cosas adicionadas que en un inicio no las quiso incorporar sun, y que ahora csharp las tiene, por ello csharp es mejor que java. Pero a pesar de ello, java sigue siendo mas utilizado en el mundo… el porq???…. tarea para la casa :P.
Vaya, un post con chicha y a la brasa, de los que me gustan… :-P
Estaba pensando en ponerte un comentario largo, pero en vez de eso creo que voy a publicar un post yo, donde se pueda ver mejor: http://diegosuarezgarcia.es/blog/2009/09/10/flames-didacticos-nº1-java-y-c/
@Sergio:
1) Java se está quedando viejo porque quiere… la 6.0 apareció el 11 de diciembre de 2006. Simplemente no han cambiado demasiadas cosas.
2) Bueno, es que el post no pretendía ser ni mucho menos técnico… simplemente quería que se viera cómo C# tiene una sintaxis mucho más «práctica».
@Diego Suárez, a ti ya te respondo en tu blog :P
Lo Cierto es que java Es Multiplataforma
a decir que puedes extender funcionalidades utilizando codigo nativo y convertirla conpatible en varios sistema operativos
Cosa C# no lo hace Como los quedo
@Jorge Huamani Alvaro
Eso de que no es multiplataforma… ¿de donde lo hemos sacado?
Lo de multiplaforma que dicen que diferencia a Java, c# o .net lo resuelven facilmente con webservices.
Write once run anywhere
Realmente prefiero c#,yo que comence con un lenguaje dinamico como javascript y luego pase a python,me parece que c# es bastante menos duro el codigo.
Bueno desde la perspectiva de alguien que no ha programado en C#, siento que este lenguaje si puede ser amigable a primera vista, pero enfocado a WINDOWS.
He utilizado algunos repositorios programados en c#, pero seria un lio utilizarlos en MAC o Linux ya que dependen de Framework. NET
Muy interesante