csharp-strings

Qué son y cómo funcionan los Strings en C#

  • 3 min

En C#, un string es un tipo de dato que representa una secuencia de caracteres Unicode que nos permiten manejar texto de forma cómoda.

Se trata de un objeto inmutable de la clase System.String, lo que significa que una vez creado, no puede ser modificado.

  • Inmutabilidad: Una vez creado, un string no puede ser modificado. Cualquier operación que modifique el contenido de un string genera un nuevo objeto string.
  • Basado en Unicode: Los string en C# utilizan la codificación Unicode, lo que permite representar caracteres de prácticamente todos los idiomas y símbolos.

Declaración y literales

Tenemos varias formas de declarar cadenas (casi demasiadas), cada una con sus características especiales,

Literal Estándar

El de toda la vida. Requiere escapar caracteres especiales con la barra invertida \.

string ruta = "C:\\Windows\\System32"; // Necesitamos doble barra
string salto = "Hola\nMundo";          // \n es salto de línea

Copied!

Verbatim Strings (@)

Si ponemos una arroba @ delante, le decimos a C# que ignore los caracteres de escape. Es útil para rutas de archivos o expresiones regulares (RegEx).

string ruta = @"C:\Windows\System32"; // ¡Mucho más limpio!
string html = @"<div class=""box"">"; // Las comillas se escapan doblándolas

Copied!

String Interpolation ($)

Introducido en C# 6, es la forma moderna de formatear. Permite meter variables directamente dentro del texto.

int edad = 30;
string mensaje = $"Tengo {edad} años";

Copied!

Raw String Literals (""")

Desde C# 11, permite escribir bloques de texto multilínea sin preocuparse por comillas o escapes. Ideal para JSON, XML o SQL embebido.

string json = """
    {
        "nombre": "Luis",
        "web": "luisllamas.es"
    }
    """;

Copied!
  • Se comporta parecido a un tipo valor (tiene semántica de valor).
  • Pero técnicamente es un Tipo de Referencia.

Esto significa que la variable en el Stack solo guarda una dirección de memoria. El contenido real del texto vive en el Heap.

Sin embargo, C# sobrecarga el operador de igualdad == para que compare el contenido y no la referencia. Por eso "hola" == "hola" devuelve true, aunque sean dos objetos distintos en memoria.

La inmutabilidad

La propiedad más importante, los strings en C# son inmutables. Es decir, una vez que se crea un string en la memoria, no se puede cambiar. Jamás.

“Pero Luis, si yo hago esto, el texto cambia”

string texto = "Hola";
texto = texto + " Mundo";
Copied!

No, no cambia. Lo que ocurre internamente es:

Se crea “Hola” en memoria.

Se crea ” Mundo” en memoria.

Se crea un tercer string nuevo que contiene “Hola Mundo”.

La variable texto apunta al nuevo.

El “Hola” original se queda “huérfano” en la memoria esperando a que pase el Basurero (Garbage Collector).

El motivo principal para que los String sean inmutables es la seguridad y prevención de errores (de hecho es algo común en muchos los lenguajes).

Esta característica es muy importante para el rendimiento. Si concatenas strings dentro de un bucle for miles de veces, estás creando miles de objetos basura que ahogan la memoria. Para eso usaremos StringBuilder.

String Vacío vs Null

Otro punto de error clásico.

  • null: La variable no apunta a nada. No existe objeto. Si intentas acceder a ella NullReferenceException.
  • String.Empty o "": Existe un objeto en memoria, pero tiene longitud 0. Es un texto válido.
  • WhiteSpace: Texto que solo tiene espacios, tabuladores o saltos de línea.

Para comprobar esto de forma robusta, usad siempre:

if (string.IsNullOrEmpty(texto)) { ... }
if (string.IsNullOrWhiteSpace(texto)) { ... } // Incluye espacios en blanco

Copied!