Manipulación de Strings

Cómo funcionan internamente los strings y cómo trabajar con ellos

Manipulación de Strings


Cómo funcionan internamente los strings y cómo trabajar con ellos

« Volver al inicio

Sabiendo ya lo que son los arrays, anteriormente llegamos a explicar que los string se comportan internamente como si fueran un array de caracteres (de tipo char[]):

using System;

class program {
	static void Main() {
		char[] cadena = { 'H', 'o', 'l', 'a' };
		Console.WriteLine(cadena);
	}
}

La salida por consola de este programa sería: Hola.

Sin embargo, esta forma de asignar variables es poco práctica para nosotros como programadores, pues el tener que formar arrays de char de esta forma puede resultar farragoso. Lo que nos interesa es poder guardar o cambiar una variable de tipo cadena de forma más sencilla y más legible.

Si lo queremos hacer con un array de char, podemos usar el método ToCharArray() para poder convertir una cadena a array de chars:

using System;

class program {
	static void Main() {
		char[] cadena = "Hola".ToCharArray();
		Console.WriteLine(cadena);
	}
}

Este programa hará exactamente lo mismo que el bloque anterior.

¿Y qué sentido tiene hacer esto, si con un string puedo darle también el valor de cadena que quiera sin llamar a ToCharArray() ni a otros métodos raros?

De acuerdo. Vamos a cambiar el código anterior y lo vamos a declarar directamente como string:

using System;

class program {
	static void Main() {
		string cadena = "Hola";
		Console.WriteLine(cadena);
	}
}

Y funcionará como se esperaba, mostrando Hola por consola. Los strings los manejaremos mucho en nuestros programas, mientras que los array de char (que en adelante los llamaremos de tipo char[]) son más bien una forma tradicional de representar una cadena de caracteres en un programa, con origen en el lenguaje C.

Cómo manipular cadenas

En programas que hagamos más adelante, es posible que a veces necesitemos modificar parte de un string. Por ejemplo, en lugar de "Hola", vamos a cambiar el segundo carácter para que en su lugar la variable devuelva: "Hala". Para eso tendremos en cuenta que nuestra cadena tiene estos índices:

string cadena =

Índice de array0123
Valor'H''o''l''a'

cadena[1] nos devolverá 'o' porque se encuentra en el índice 1. Por lo tanto, sólo nos hace falta modificar dicho índice y asignarle el valor 'a' para cumplir con nuestro pequeño objetivo, ¿verdad?:

using System;

class program {
	static void Main() {
		string cadena = "Hola";
		cadena[1] = 'a';	// 'o' -> 'a'
		Console.WriteLine(cadena);
	}
}

Compilamos y… ¡¡tacháaaaan!! ¡¡Sorpresa!! El compilador nos devuelve este pedazo error:

error CS0200: Property or indexer `string.this[int]`
cannot be assigned to (it is read-only)

Traducido al cristiano: a ningún índice (lo que encerramos entre [ corchetes ]) del string cadena puede asignársele otro valor, ya que los índices de los strings son de sólo lectura. Es to quiere decir que los strings en C# son inmutables, por lo que no pueden ser tratados como simples arrays de char, ya que a diferencia, sus índices no pueden ser modificados directamente (como hemos dicho, son de sólo lectura).

Sin embargo, si la cadena la declaramos por la forma tradicional de C, sí que podremos jugar con sus índices sin que nos devuelva ningún error (siempre que no nos salgamos del índice):

using System;

class program {
	static void Main() {
		char[] cadena = "Hola".ToCharArray();
		cadena[1] = 'a';	// 'o' -> 'a'
		Console.WriteLine(cadena);
	}
}

¿Por qué sucede esto? La respuesta corta es porque los creadores de los lenguajes .NET (Microsoft) han decidido que sea así. La respuesta larga: por seguridad, para evitar que otros procesos o APIs de terceros puedan realizar llamadas a manipular los strings accediendo directamente a sus índices.

Ahora bien, si aún así queremos seguir trabajando con el tipo string en nuestro programa y queremos modificar strings accediendo directamente a sus índices, tenemos dos opciones:

  • Opción 1: asignando a un char[] temporal el valor de un string previamente asignado, modificarlo, y luego volver a asignárselo al string para su posterior uso:
using System;

class program {
	static void Main() {
		string cadena = "Hola";
		Console.WriteLine(cadena);	// Hola
		
		char[] temp = cadena.ToCharArray();
		temp[1] = 'a';
		cadena = new string(temp);
		Console.WriteLine(cadena);	// Hala
	}
}
  • Opción 2: lo mismo, pero usando StringBuilder en su lugar (requiere Using System.Text:
using System;
using System.Text;	// OJO

class program {
	static void Main() {
		string cadena = "Hola";
		Console.WriteLine(cadena);
		
		StringBuilder temp = new StringBuilder(cadena);
		temp[1] = 'a';
		cadena = temp.ToString();
		Console.WriteLine(cadena);
	}
}

Ambos resultados son equivalentes. Pero, si nos fijamos bien, se trabaja de forma distinta. Sea A un string cualquiera y B una cadena que usaremos de forma temporal para modificar su información:

  • Con el método clásico de usar el tipo char[], necesitamos primero convertir explícitamente el string A a un array de chars B, y luego crear una nueva instancia de string guardando su valor de nuevo en A:
string cadenaString = "Hola";
// ...
char[] arrayDeChars = cadenaString.ToCharArray();	// Creamos una cadena modificable
// ... hacemos cosas con arrayDeChars ...
cadenaString = new string(arrayDeChars);	// Guardamos el valor modificado en el string
  • Con la herramienta de C# StringBuilder, hacemos un poco lo contrario: primero creamos en B una nueva instancia de StringBuilder guardando el valor del string A, y luego convertir explícitamente el valor del StringBuilder B a string para poder guardarlo de vuelta en A:
string cadenaString = "Hola";
// ...
StringBuilder cadenaModificable = new StringBuilder(cadenaString);	// Creamos una cadena modificable
// ... hacemos cosas con cadenaModificable ...
cadenaString = cadenaModificable.ToString();	// Guardamos el valor modificado en el string

Sin embargo, hay veces que no nos hace falta modificar strings accediendo directamente a sus índices para modificarlos, salvo que necesitemos aplicarles un algoritmo muy concreto.

Los strings de C# cuentan con numerosos métodos para poder jugar con los strings que nos permitirá realizar muchas más cosas que simplemente reemplazar caracteres, sin necesidad de crear variables auxiliares (ni char[]s ni StringBuilders). En el siguiente artículo veremos cada uno de los métodos de string que podremos usar en las cadenas de texto y que serán muy importantes de cara al primer examen.

Ir al siguiente tema »

comments powered by Disqus