Introducción: ¿Por qué los desarrolladores principiantes de C# cometen los mismos errores?
C# es un lenguaje potente y elegante, pero su flexibilidad a menudo se convierte en una trampa para los principiantes. Muchos vienen de otros lenguajes (Python, JavaScript) e intentan aplicar patrones habituales que en .NET funcionan de manera diferente. En este artículo analizaremos los 5 errores más comunes que cometen los desarrolladores principiantes de C#. No solo aprenderá "cómo no hacerlo", sino que también obtendrá ejemplos concretos de código correcto. ¡Allá vamos!
1. Confusión entre ref, out y paso por valor
Uno de los errores más frecuentes es no entender cómo C# pasa los parámetros. Por defecto, todos los tipos de valor (int, bool, struct) se pasan por valor. Los tipos de referencia (clases) se pasan por referencia, pero la referencia en sí misma se pasa por valor.
Error: Intentar modificar un tipo de valor a través de un parámetro sin ref
public void BadIncrement(int number){ number++; // ¡Esto no cambiará la variable original!}
int x = 5;BadIncrement(x);Console.WriteLine(x); // Mostrará 5, no 6Cómo hacerlo correctamente: Use ref para tipos de valor
public void GoodIncrement(ref int number){ number++; // Ahora el cambio se reflejará en el original}
int y = 5;GoodIncrement(ref y);Console.WriteLine(y); // Mostrará 6Consejo: Use out si el método debe devolver varios valores. Pero recuerde: out requiere inicialización obligatoria dentro del método.
2. Ignorar la inmutabilidad de las cadenas (string)
Muchos principiantes piensan que string es una simple matriz de caracteres. En realidad, las cadenas en C# son inmutables (immutable). Cada operación de concatenación crea un nuevo objeto en la memoria.
Error: Concatenación en un bucle
string result = "";for (int i = 0; i < 1000; i++){ result += i.ToString(); // ¡Cada iteración crea una nueva cadena! (O(n²))}Cómo hacerlo correctamente: Use StringBuilder
var sb = new System.Text.StringBuilder();for (int i = 0; i < 1000; i++){ sb.Append(i); // Funciona rápido, O(n)}string result = sb.ToString();Importante: Para la concatenación simple de 2-3 cadenas, use $"string {variable}" (interpolación). Para bucles, siempre use StringBuilder.
3. Manejo incorrecto de null y NullReferenceException
Los desarrolladores principiantes a menudo olvidan verificar si los objetos son null, lo que provoca que la aplicación falle con NullReferenceException. Este es el error más popular en C#.
Error: Llamar a un método sin verificación
string name = GetName(); // puede devolver nullint length = name.Length; // Si name == null - ¡el programa fallará!Cómo hacerlo correctamente: Use el operador condicional null (?.) y la coalescencia null (??)
string name = GetName();int length = name?.Length ?? 0; // Si name es null, length será 0
// O la verificación clásicaif (name != null){ Console.WriteLine(name.Length);}Consejo para .NET 6+: Active los nullable reference types en el proyecto. El compilador le advertirá sobre posibles peligros de null.
4. "Tragar" excepciones (catch vacío)
Los principiantes a menudo escriben catch (Exception) { } — un bloque de captura vacío. Esto convierte al código en un "asesino silencioso": el programa sigue funcionando, pero con datos incorrectos.
Error: catch vacío
try{ int.Parse(userInput);}catch (Exception){ // Ignoramos el error - ¡mala práctica!}Cómo hacerlo correctamente: Capture excepciones específicas o registre
try{ int result = int.Parse(userInput);}catch (FormatException ex){ Console.WriteLine($"Error de formato");