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, el grupo de internos, que contiene una referencia única a cada cadena literal única declarada o creada mediante programación en el programa de llamada. 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 en el grupo de internos y lo asigna a cada variable.

El Intern método usa el grupo de internos para buscar una cadena igual que el 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 para el grupo de internos, a continuación, se devuelve esa referencia.

En el ejemplo siguiente, la cadena s1, que tiene un valor de "MiPrueba", está ya aplicado el método Intern porque es un literal en el programa. La System.Text.StringBuilder clase genera un nuevo objeto de cadena que tiene el mismo valor que s1. Una referencia a esa cadena se asigna a s2. 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. Esta referencia, a continuación, se asigna 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 Emptyy la variable str2 se asigna la referencia a Empty devuelto por una llamada 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.");

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

Si desea 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 libera hasta que termina de 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 una cadena, primero debe crear la cadena. La memoria utilizada por la String objeto todavía se debe asignar, incluso si la memoria se finalmente recopilarán.

La versión 2.0 de .NET Framework 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 aplicado el 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: