Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Método String.Intern (String)

 

Publicado: octubre de 2016

Recupera la referencia del sistema al objeto String especificado.

Espacio de nombres:   System
Ensamblado:  mscorlib (en mscorlib.dll)

public static string Intern(
	string str
)

Parámetros

str
Type: System.String

Cadena que se va a buscar en el grupo de internos.

Valor devuelto

Type: System.String

Referencia del sistema a str si se le ha aplicado el método Intern; de lo contrario, una nueva referencia a una cadena con el valor de str.

Exception Condition
ArgumentNullException

El valor de str es null.

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. Por lo tanto, existe una instancia de una cadena literal con un valor determinado sólo una vez en el sistema.

Por ejemplo, si asigna la misma cadena literal a varias variables, el tiempo de ejecución recupera la misma referencia a la cadena literal de la agrupación interna y asigna a cada variable.

El Intern método usa la agrupación interna para buscar una cadena igual al valor de str. Si existe este tipo de cadena, se devuelve su referencia en el grupo de internos. Si la cadena no existe, una referencia a str se agrega a la agrupación interna, se devuelve esa referencia.

En el ejemplo siguiente, la cadena s1, que tiene un valor de "MyTest", está ya aplicado el método Intern porque es un literal del programa. La System.Text.StringBuilder clase genera un nuevo objeto de cadena que tiene el mismo valor que s1. S2 se le asigna una referencia a dicha cadena. El Intern método busca una cadena que tiene el mismo valor que s2. Dado que este tipo de cadena existe, el método devuelve la misma referencia que está asignada a s1. Que hacen referencia a continuación, se asignan a s3. Las referencias s1 y s2 son iguales porque hacen referencia a objetos diferentes; 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 IsInterned método.

En el .NET Framework 3.5 Service Pack 1, el Intern método revierte a su comportamiento en .NET Framework 1.0 y 1.1 con respecto a la cadena vacía. En el ejemplo siguiente, la variable str1 se asigna una referencia a Empty, y la variable str2 se asigna la referencia a Empty que se devuelve al llamar a la Intern método después de convertir un StringBuilder objeto cuyo valor es Empty en una cadena. A continuación, las referencias contenidas en str1 y str2 se compara la igualdad.

string str1 = String.Empty;
string str2 = String.Empty;

StringBuilder sb = new StringBuilder().Append(String.Empty);
str2 = String.Intern(sb.ToString());	

if((object)str1==(object)str2)
	Console.WriteLine("The strings are equal.");
else
	Console.WriteLine("The strings are not equal.");

En el .NET Framework 1.0, .NET Framework 1.1, y .NET Framework 3.5 SP1, str1 y str2 son iguales. En el .NET Framework 2.0 Service Pack 1 y .NET Framework 3.0, str1 y str2 no son iguales.

Si intenta reducir la cantidad total de memoria asigna la aplicación, tenga en cuenta que el método Intern a una cadena tiene dos efectos secundarios no deseados. En primer lugar, la memoria asignada para aplicado el método Intern String objetos no es probable que se lance hasta que finaliza common language runtime (CLR). El motivo es que la referencia de CLR para el método Intern String objeto puede persistir después de la aplicación, o incluso el dominio de aplicación, finalice. En segundo lugar, para intern a una cadena, primero debe crear la cadena. La memoria utilizada por la String objeto debe mantenerse asignado, aunque la memoria finalmente se puede recolectar.

.NET Framework versión 2.0 presenta la CompilationRelaxations.NoStringInterningmiembro de enumeración. El NoStringInterning miembro marca un ensamblado que no es necesario ser un literal de cadena interno. Puede aplicar NoStringInterning a un ensamblado mediante el CompilationRelaxationsAttribute atributo. Además, cuando se usa el Ngen.exe (Native Image Generator) para compilar un ensamblado antes de tiempo de ejecución, las cadenas no aplica el método Intern a través de módulos.

En el ejemplo siguiente se utiliza tres cadenas que tienen el mismo valor para determinar si una cadena recién creada y una cadena de método Intern son iguales.

// Sample for String.Intern(String)
using System;
using System.Text;

class Sample {
    public static void Main() {
    String s1 = "MyTest";
    String s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
    String s3 = String.Intern(s2); 
    Console.WriteLine("s1 == '{0}'", s1);
    Console.WriteLine("s2 == '{0}'", s2);
    Console.WriteLine("s3 == '{0}'", s3);
    Console.WriteLine("Is s2 the same reference as s1?: {0}", (Object)s2==(Object)s1); 
    Console.WriteLine("Is s3 the same reference as s1?: {0}", (Object)s3==(Object)s1);
    }
}
/*
This example produces the following results:
s1 == 'MyTest'
s2 == 'MyTest'
s3 == 'MyTest'
Is s2 the same reference as s1?: False
Is s3 the same reference as s1?: True
*/

.NET Framework
Disponible desde 1.1
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Volver al principio
Mostrar: