String y string en C#: ¿son lo mismo o no? Análisis con ejemplos
\n\nSi alguna vez has escrito código en C#, seguramente habrás notado que las cadenas se pueden declarar de dos maneras:
\n\nstring name = "Ana";\nString greeting = "¡Hola!";\n\nY ambas opciones funcionan. Surge una pregunta razonable: ¿cuál es la diferencia entre string y String en C#? ¿Son tipos diferentes? ¿Uno es más rápido? ¿O es solo una peculiaridad de los desarrolladores del lenguaje?
\n\nSpoiler: no hay diferencia. Pero no todo es tan simple como parece a primera vista. Analicemos a fondo para que no solo sepas la respuesta a la pregunta popular de Stack Overflow, sino que también entiendas por qué se hizo así y qué opción es mejor usar en proyectos reales.
\n\nRespuesta corta: string es un alias de System.String
\n\nEn C#, la palabra clave string es simplemente un alias para la clase System.String. De la misma manera que int es un alias para System.Int32, y bool lo es para System.Boolean.
Cuando el compilador ve string, automáticamente lo sustituye por System.String. Esto significa que ambas declaraciones se compilan en el mismo código IL:
// Estas dos líneas son absolutamente idénticas a nivel de IL\nstring a = "Hola";\nSystem.String b = "Mundo";\n\nSi abres un .dll o .exe compilado con ILSpy o dotPeek, no encontrarás ninguna diferencia entre estas dos declaraciones.
\n\nPero entonces, ¿por qué existen ambas opciones?
\n\nHistóricamente, C# heredó la sintaxis de C/C++, donde string no es una palabra clave, sino una clase. Los desarrolladores de .NET decidieron agregar alias convenientes para que el código se vea más natural y familiar para los programadores que vienen de otros lenguajes.
Además, los alias no requieren importar el espacio de nombres. Para usar String, debes agregar using System; o escribir el nombre completo System.String. Con string no hay ese problema: está disponible siempre.
¿Cuándo usar string y cuándo String?
\n\nLa regla de oro que siguen la mayoría de los equipos y que recomienda Microsoft en la documentación de C#:
\n\n- \n
- Usa
stringal declarar variables, parámetros de métodos, valores de retorno — en todos los lugares donde esta palabra clave funciona como tipo. \n - Usa
Stringsolo al acceder a métodos estáticos de la clase (por ejemplo,String.IsNullOrEmpty()) o al usarSystem.Stringen esos raros casos donde necesitas especificar explícitamente el espacio de nombres. \n
¿Por qué? Porque string es una palabra clave del lenguaje, se resalta con color en el IDE y queda claro de inmediato que es una cadena. String es solo el nombre de una clase y es más fácil confundirlo con otras clases.
Ejemplo de buen estilo
\n\n// Declaración de variable (usamos string)\nstring userName = "Iván";\n\n// Llamada a método estático (usamos String)\nif (String.IsNullOrEmpty(userName))\n{\n Console.WriteLine("El nombre no puede estar vacío");\n}\n\n// Parámetro de método (usamos string)\npublic void Greet(string name)\n{\n Console.WriteLine($"¡Hola, {name}!");\n}\n\n¿Hay alguna diferencia en el rendimiento?
\n\nMuchos desarrolladores se preguntan: ¿será que string funciona más rápido que String? ¿O al revés?
Respuesta: no hay diferencia en el rendimiento. Ninguna. Absolutamente. Después de la compilación, ambas opciones se convierten en el mismo código IL. El tiempo de ejecución es idéntico.