¿Por qué dicen que C# es igual que Java?

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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:

1
2
3
4
5
6
    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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
		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#:

1
2
3
4
5
6
            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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
	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#:

1
2
            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…

About the Author

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P