String vs string en C#: ¿cuál es la diferencia y qué elegir?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

String y string en C#: ¿son lo mismo o no? Análisis con ejemplos

\n\n

Si alguna vez has escrito código en C#, seguramente habrás notado que las cadenas se pueden declarar de dos maneras:

\n\n
string name = "Ana";\nString greeting = "¡Hola!";
\n\n

Y 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\n

Spoiler: 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\n

Respuesta corta: string es un alias de System.String

\n\n

En 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.

\n\n

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:

\n\n
// Estas dos líneas son absolutamente idénticas a nivel de IL\nstring a = "Hola";\nSystem.String b = "Mundo";
\n\n

Si abres un .dll o .exe compilado con ILSpy o dotPeek, no encontrarás ninguna diferencia entre estas dos declaraciones.

\n\n

Pero entonces, ¿por qué existen ambas opciones?

\n\n

Histó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.

\n\n

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.

\n\n

¿Cuándo usar string y cuándo String?

\n\n

La 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 string al declarar variables, parámetros de métodos, valores de retorno — en todos los lugares donde esta palabra clave funciona como tipo.
  • \n
  • Usa String solo al acceder a métodos estáticos de la clase (por ejemplo, String.IsNullOrEmpty()) o al usar System.String en esos raros casos donde necesitas especificar explícitamente el espacio de nombres.
  • \n
\n\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.

\n\n

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\n

Muchos desarrolladores se preguntan: ¿será que string funciona más rápido que String? ¿O al revés?

\n\n

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.

Blogs

Book Recommendations