Common Language Runtime conserva el almacenamiento de cadenas mediante el mantenimiento de una tabla (denominada agrupación interna) que contiene una sola referencia a cada cadena literal única declarada o creada mediante programación en el programa. Como consecuencia, una instancia de una cadena literal con un valor determinado sólo existe una vez en el sistema.
Por ejemplo, si se asigna la misma cadena literal a varias variables, el motor en tiempo de ejecución recupera la misma referencia a la cadena literal a partir de la agrupación interna y asigna esta referencia a cada variable.
El método Intern utiliza la agrupación interna para buscar una cadena que sea igual al valor de str. Si existe una cadena con estas características, se devuelve su referencia en la agrupación interna. Si esta cadena no existe, se agrega a la agrupación interna una referencia a str y, después, se devuelve la referencia.
En el siguiente ejemplo de C#, ya se ha aplicado el método Intern a la cadena s1, que tiene un valor de "MyTest", porque se trata de un literal del programa.
La clase System.Text.StringBuilder genera un nuevo objeto de cadena que tiene el mismo valor que s1. A la cadena s2 se le asigna una referencia a dicha cadena.
El método Intern busca una cadena que tenga el mismo valor que s2. Como existe una cadena con estas características, el método devuelve la misma referencia que se ha asignado a s1 y, después, esta referencia se asigna a s3.
Las referencias s1 y s2 son distintas porque hacen referencia a objetos distintos, mientras que las referencias s1 y s3 son iguales porque hacen referencia a la misma cadena.
String s1 = "MyTest";
String s2 = new StringBuilder().Append("My").Append("Test").ToString();
String s3 = String.Intern(s2);
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.
Compare este método con el método IsInterned.
Consideraciones de versión
A partir de la versión 2.0 de .NET Framework, hay un cambio en el comportamiento del método Intern. En la siguiente secuencia de código de C#, a la variable str1 se le asigna una referencia a Empty, a la variable str2 se le asigna una referencia a Empty que devuelve el método Intern y, a continuación, se comparan las referencias que contienen str1 y str2 para comprobar si son iguales.
string str1 = String.Empty;
string str2 = String.Intern(String.Empty);
if ((object) str1) == ((object) str2) …
En la versión 1.1 de .NET Framework, str1 y str2 no son iguales, pero a partir de la versión 2.0 de .NET Framework, str1 y str2 son iguales.
Consideraciones de rendimiento
Si intenta reducir la cantidad total de memoria que la aplicación asigna, tenga en cuenta que la aplicación del método Intern a una cadena tiene dos efectos secundarios no deseados. Primero, no es probable que la memoria asignada para los objetos String a los que se ha aplicado el método Intern se libere hasta que finaliza Common Language Runtime (CLR). Esto es debido a que la referencia de CLR al objeto String al que se ha aplicado el método Intern puede persistir después de que la aplicación, o incluso el dominio de aplicación, finalice. En segundo lugar, para aplicar el método Intern a una cadena, es preciso crear primero la cadena. La memoria utilizada por el objeto String debe mantenerse asignada, aunque sea recogida durante la recolección de elementos no utilizados.