Essential C# 2.0 y The C# Programming Language

El primero es de Mark Michaelis, y el Segundo de Anders Hejlsberg, Scott Wiltamuth y Peter Golde, y en conjunto suman unas mil cuatrocientas páginas; estas han sido mis dos últimas lecturas profesionales. Y la verdad es que ambos libros valen el dinero que cuestan (más los portes desde Estados Unidos).

Nadie que quiera aprender C# debería obviar estas dos obras, pero si realmente tiene que elegir entre una de las dos, mi recomendación es que se quede con la de Michaelis.

Mientras que la segunda es muy árida y cubre el lenguaje desde un punto de vista estricto y meramente descriptivo, la primera vive el C#. Y encima trae páginas completamente imprescindibles, esos Advanced Topics no tienen precio para entender de verdad el lenguaje.

A esta pareja les falta CLR via C#, que lo tengo en las listas de Amazon esperando la siguiente compra, que no creo que tarde mucho a hacer, ya que vuelven a tener stock de otros que pensaba comprar…

Quizás el mayor problema de esos libros sea el idioma, inglés, aunque es bastante sencillo y claro de entender, aunque el de Hejlsberg sea un poco más difícil, cualquier programador acostumbrado a leer la documentación del Visual Studio no debería tener problemas en entenderlos (hasta yo lo he hecho).

En ninguna de las dos vas a encontrar mucho .NET Framework, ya que son libros sobre C# (que en teoría es un lenguaje sin relación con ninguna implementación concreta de .NET). Hejlsberg apenas hace mención de clases o elementos .NET, Michaelis no se corta en especificar alguna que otra cosa, justo lo imprescindible para hacer esta obra más entendible y más lógica que la otra, y es por eso que la recomiendo puesto que C# sin .NET (o mono, o dotgnu) no es nada.

Aprendí C# y .NET hace unos años con el libro C# Professional 2.0 de la casa Wrox, y me quedaba el prurito de aprehenderlo de verdad, por lo que pregunté a Octavio Hernández (gracias, master) que me recomendara el mejor libro sobre C# sin .NET que hubiera en el mercado, y él respondió con los dos que nos ocupa.

Porque aprender .NET es una chorrada: tan sólo hay que ir a la documentación y mirar qué clases hay y cuáles son sus métodos, de la misma forma que cuando uno necesita hacer algo en Win32 se acerca a su API y la consulta. Otro tema es que encuentres lo que buscas, o que esté pero no seas capaz de encontrarlo, que me imagino nos pasa a todos con mayor o menor frecuencia.

Pero un programador debe conocer el lenguaje que usa con profundidad, por eso quería verlo desnudo, sin el arropamiento de su biblioteca de clases. Y siendo sincero, no me ha gustado. No estoy diciendo que sea un mal lenguaje, estoy diciendo que no me ha gustado mucho, básicamente por esa dualidad indefinida entre los tipos básicos y los objetos, entre los encajamientos y desencajamientos que creo haber entendido bien, aunque al parecer no cuándo se producen.

Desde luego tiene cosas maravillosas, como los atributos, la reflexión, ciertas construcciones, pero no me gusta mucho. Eso no quiere decir que no vaya a seguir usándolo.

Tengo pendiente una entrada sobre los atributos y la reflexión, aunque no sé si al final la escribiré o no. También se queda en el tintero comprobar de forma práctica cómo funcionan los box/unbox y su rendimiento, por lo menos hasta más adelante que tenga más tiempo libre.

Un comentario sobre “Essential C# 2.0 y The C# Programming Language”

  1. La reflexión no creo que tenga muchos problemas de rendimiento. Evidentemente se pierde tiempo en consultar los metadatos y todo eso, pero una vez obtenidos las llamadas deberían tardar sólo un poco más, el tiempo de una indirección más (es decir, si en una llamada a un método se mira la dirección y se ejecuta, en una llamada a método mediante reflexión se mira la dirección del invocador, que mira la dirección del método a llamar y lo ejecuta).

    Lo que sí es lento de narices es Interop mediante atributos del .NET, que al parecer en cada llamada al sistema invoca de nuevo todo el asunto, es decir, carga la dll en memoria, le hace hueco en su espacio de direcciones, la inicializa, hace la llamada pertinente, la cierra y la descarga para cada llamada. Eso sí que es perder el tiempo.

    Para las tripas del CLR no es obligatorio saber C++, pero en cierta medida su conocimiento ayuda, no por el C++ en sí, sino por la filosofía del lenguaje, y más que nada te ayudaría si sabes qué hay detrás del C++, es decir, qué código genera cada construcción del lenguaje.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *