String.Intern(String) String.Intern(String) String.Intern(String) String.Intern(String) Method

Definición

Recupera la referencia del sistema al objeto String especificado.Retrieves the system's reference to the specified String.

public:
 static System::String ^ Intern(System::String ^ str);
public static string Intern (string str);
static member Intern : string -> string
Public Shared Function Intern (str As String) As String

Parámetros

str
String String String String

Cadena que se va a buscar en el grupo de internos.A string to search for in the intern pool.

Devoluciones

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.The system's reference to str, if it is interned; otherwise, a new reference to a string with the value of str.

Excepciones

Ejemplos

El ejemplo siguiente 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.The following example uses three strings that are equal in value to determine whether a newly created string and an interned string are equal.

// Sample for String::Intern(String)
using namespace System;
using namespace System::Text;
int main()
{
   String^ s1 = "MyTest";
   String^ s2 = (gcnew 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}", s2 == s1 );
   Console::WriteLine( "Is s3 the same reference as s1?: {0}", s3 == 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
*/
// 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
*/
' Sample for String.Intern(String)
Imports System
Imports System.Text

Class Sample
   
   Public Shared Sub Main()
      Dim s1 As [String] = "MyTest"
      Dim s2 As [String] = New StringBuilder().Append("My").Append("Test").ToString()
      Dim s3 As [String] = [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}", s2 Is s1)
      Console.WriteLine("Is s3 the same reference as s1?: {0}", s3 Is s1)
   End Sub 'Main
End Class 'Sample
'
's1 = 'MyTest'
's2 = 'MyTest'
's3 = 'MyTest'
'Is s2 the same reference as s1?: False
'Is s3 the same reference as s1?: True
'

Comentarios

Common language runtime conserva el almacenamiento de cadenas mediante el mantenimiento de una tabla, denominada el grupo de internos, que contiene una referencia única a cada cadena literal única, declarada o creada mediante programación en el programa.The common language runtime conserves string storage by maintaining a table, called the intern pool, that contains a single reference to each unique literal string declared or created programmatically in your program. Por lo tanto, existe una instancia de una cadena literal con un valor determinado solo una vez en el sistema.Consequently, an instance of a literal string with a particular value only exists once in the system.

Por ejemplo, si asigna la misma cadena literal a varias variables, el tiempo de ejecución recupera la misma referencia a la cadena literal desde el grupo de internos y lo asigna a cada variable.For example, if you assign the same literal string to several variables, the runtime retrieves the same reference to the literal string from the intern pool and assigns it to each variable.

El Intern método usa el grupo de internos para buscar una cadena igual que el valor de str.The Intern method uses the intern pool to search for a string equal to the value of str. Si no existe este tipo de cadena, se devuelve su referencia en el grupo de internos.If such a string exists, its reference in the intern pool is returned. Si la cadena no existe, una referencia a str se agrega para el grupo de internos, a continuación, se devuelven esa referencia.If the string does not exist, a reference to str is added to the intern pool, then that reference is returned.

En el ejemplo siguiente, la cadena s1, que tiene un valor de "MyTest", ya se esté internado porque es un literal en el programa.In the following example, the string s1, which has a value of "MyTest", is already interned because it is a literal in the program. La System.Text.StringBuilder clase genera un nuevo objeto de cadena que tiene el mismo valor que s1.The System.Text.StringBuilder class generates a new string object that has the same value as s1. Una referencia a esa cadena se asigna a s2.A reference to that string is assigned to s2. El Intern método busca una cadena que tiene el mismo valor que s2.The Intern method searches for a string that has the same value as s2. Dado que este tipo de cadena existe, el método devuelve la misma referencia que está asignada a s1.Because such a string exists, the method returns the same reference that is assigned to s1. Esta referencia, a continuación, se asigna a s3.That reference is then assigned to 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.References s1 and s2 compare unequal because they refer to different objects; references s1 and s3 compare equal because they refer to the same string.

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.
Dim s1 As String = "MyTest" 
Dim s2 As String = New StringBuilder().Append("My").Append("Test").ToString() 
Dim s3 As String = String.Intern(s2) 
Console.WriteLine(CObj(s2) Is CObj(s1))      ' Different references.
Console.WriteLine(CObj(s3) Is CObj(s1))      ' The same reference.

Compare este método con el IsInterned método.Compare this method to the IsInterned method.

Consideraciones sobre la versiónVersion Considerations

En el .NET Framework 3.5 Service Pack 1.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.In the .NET Framework 3.5 Service Pack 1.NET Framework 3.5 Service Pack 1, the Intern method reverts to its behavior in the .NET Framework 1.0 and 1.1 with regard to interning the empty string. En el ejemplo siguiente, la variable str1 se asigna una referencia a Emptyy la variable str2 se asigna a la referencia a Empty devuelto por una llamada a la Intern método después de convertir un StringBuilderobjeto cuyo valor es Empty en una cadena.In the following example, the variable str1 is assigned a reference to Empty, and the variable str2 is assigned the reference to Empty that is returned by calling the Intern method after converting a StringBuilder object whose value is Empty to a string. A continuación, las referencias contenidas en str1 y str2 se compara la igualdad.Then the references contained in str1 and str2 are compared for equality.

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.");
Dim str1 As String = String.Empty
Dim str2 As String = String.Empty

Dim sb As StringBuilder = New StringBuilder().Append(String.Empty)
str2 = String.Intern(sb.ToString())	

If CObj(str1) Is CObj(str2) Then
	Console.WriteLine("The strings are equal.")
Else
	Console.WriteLine("The strings are not equal.")
End If	

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

Consideraciones sobre el rendimientoPerformance Considerations

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.If you are trying to reduce the total amount of memory your application allocates, keep in mind that interning a string has two unwanted side effects. En primer lugar, la memoria asignada para Intern String objetos no es probable que se libere hasta que finaliza el common language runtime (CLR).First, the memory allocated for interned String objects is not likely to be released until the common language runtime (CLR) terminates. El motivo es que la referencia de CLR para el método Intern String object puede persistir después de la aplicación, o incluso el dominio de aplicación, finaliza.The reason is that the CLR's reference to the interned String object can persist after your application, or even your application domain, terminates. En segundo lugar, para intern una cadena, primero debe crear la cadena.Second, to intern a string, you must first create the string. La memoria utilizada por el String objeto todavía se debe asignar, aunque la memoria será finalmente recolectado.The memory used by the String object must still be allocated, even though the memory will eventually be garbage collected.

.NET Framework versión 2.0 presenta la CompilationRelaxations.NoStringInterning miembro de enumeración.The .NET Framework version 2.0 introduces the CompilationRelaxations.NoStringInterning enumeration member. El NoStringInterning miembro marca un ensamblado que no es necesario ser un literal de cadena interno.The NoStringInterning member marks an assembly as not requiring string-literal interning. Puede aplicar NoStringInterning a un ensamblado mediante el CompilationRelaxationsAttribute atributo.You can apply NoStringInterning to an assembly using the CompilationRelaxationsAttribute attribute. Además, cuando 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.Also, when you use the Ngen.exe (Native Image Generator) to compile an assembly in advance of run time, strings are not interned across modules.

Se aplica a

Consulte también: