Introducción: Por qué los errores son normales
El camino de todo desarrollador comienza con errores. C# (.NET) es un lenguaje potente y fuertemente tipado que perdona menos que los lenguajes dinámicos, pero a cambio ofrece fiabilidad y rendimiento. En este artículo analizaremos los 4 errores más comunes que cometen los principiantes y mostraremos cómo evitarlos. El artículo será útil tanto para quienes recién comienzan a estudiar C# como para quienes desean refrescar conocimientos.
1. Ignorar null y NullReferenceException
El error más popular en C# es NullReferenceException. Ocurre cuando intentas acceder a un miembro de un objeto que es igual a null.
Ejemplo del problema
string text = null;int length = text.Length; // ¡Error! NullReferenceExceptionLos principiantes a menudo olvidan verificar los valores devueltos por los métodos, o confían en que el objeto definitivamente existe.
Cómo hacerlo correctamente
- Siempre verifica los objetos para
nullantes de usarlos. - Usa los operadores
?.(null-conditional) y??(null-coalescing).
string text = GetText(); // puede devolver nullint? length = text?.Length; // si text == null, length será nullint safeLength = text?.Length ?? 0; // si es null, entonces 0Console.WriteLine(safeLength);Además, en C# 8.0+ aparecieron los nullable reference types, que se activan mediante #nullable enable. Estos te obligan a indicar explícitamente si una variable puede ser null, y advierten sobre problemas potenciales en tiempo de compilación.
2. Uso incorrecto de var y pérdida de legibilidad
La palabra clave var permite que el compilador determine el tipo de la variable por sí mismo. Es conveniente, pero los principiantes a menudo abusan de ella, lo que hace que el código sea ilegible.
Ejemplo de código malo
var data = GetData();var result = Process(data);var output = Transform(result); // ¿Qué tipos son? No está claro.Después de un mes, tú (o tu colega) no podrán entender rápidamente qué tipo tiene data sin mirar la definición del método.
Cuándo usar var
- Cuando el tipo es obvio por el lado derecho (por ejemplo,
var list = new List<int>();) - Al trabajar con tipos anónimos y consultas LINQ.
// Bien: el tipo es obviovar numbers = new List<int> { 1, 2, 3 };
// Bien: tipo anónimovar person = new { Name = "John", Age = 30 };
// Mal: el tipo no está clarovar config = LoadConfiguration(); // Mejor: Configuration config = LoadConfiguration();Regla de oro: usa var solo cuando mejore la legibilidad, no cuando la reduzca.
3. Tragar excepciones y bloques catch vacíos
Muchos principiantes, al encontrarse con excepciones, escriben un catch vacío o simplemente muestran un mensaje sin analizar el error. Esto hace que el programa sea inestable y dificulta la depuración.
Ejemplo de antipatrón
try{ int.Parse("no es un número");}catch (Exception){ // No hacemos nada — el error ha sido "tragado"}La aplicación continuará ejecutándose, pero en un estado incorrecto. El usuario no sabrá del problema y los datos podrían dañarse.
Cómo manejar las excepciones correctamente
- No captures
Exceptiongenéricas a menos que planees manejar todos los tipos de errores. - Captura solo las excepciones que puedas manejar (por ejemplo,
FormatException,FileNotFoundException). - Usa
finallypara liberar recursos (archivos, conexiones). - Registra los errores (logging).
try{ int number = int.Parse(userInput);}catch (FormatException ex){ // Registramos y notificamos al usuario // (el código continúa aquí en la traducción original, pero se cortó en la entrada)