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

Definition

Ruft den Verweis des Systems auf den angegebenen String ab.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

Parameter

str
String String String String

Eine im Internpool zu suchende Zeichenfolge.A string to search for in the intern pool.

Gibt zurück

Der Verweis des Systems auf str, wenn dieser im Internpool vorhanden ist, andernfalls ein neuer Verweis auf eine Zeichenfolge mit dem Wert von str.The system's reference to str, if it is interned; otherwise, a new reference to a string with the value of str.

Ausnahmen

Beispiele

Im folgenden Beispiel werden drei Zeichen folgen verwendet, die dem-Wert entsprechen, um zu bestimmen, ob eine neu erstellte Zeichenfolge und eine intererte Zeichenfolge gleich sind.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 == {s1}");
        Console.WriteLine($"s2 == {s2}");
        Console.WriteLine($"s3 == {s3}");
        Console.WriteLine($"Is s2 the same reference as s1?: {(Object)s2 == (Object)s1}"); 
        Console.WriteLine($"Is s3 the same reference as s1?: {(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
*/
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 = {s1}")
        Console.WriteLine($"s2 = {s2}")
        Console.WriteLine($"s3 = {s3}")
        Console.WriteLine($"Is s2 the same reference as s1?: {s2 Is s1}")
        Console.WriteLine($"Is s3 the same reference as s1?: {s3 Is s1}")
    End Sub
End Class
'
's1 = MyTest
's2 = MyTest
's3 = MyTest
'Is s2 the same reference as s1?: False
'Is s3 the same reference as s1?: True
'

Hinweise

Der Common Language Runtime die den Zeichen folgen Speicher beibehält, indem er eine Tabelle mit dem Namen Internpool verwaltet, die einen einzelnen Verweis auf jede eindeutige Literalzeichenfolge enthält, die im Programm Programm gesteuert deklariert oder erstellt wurde.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. Folglich ist eine Instanz einer Literalzeichenfolge mit einem bestimmten Wert nur einmal im System vorhanden.Consequently, an instance of a literal string with a particular value only exists once in the system.

Wenn Sie z. b. die gleiche Literalzeichenfolge mehreren Variablen zuweisen, ruft die Laufzeit denselben Verweis auf die Literalzeichenfolge aus dem Internpool ab und weist Sie jeder Variablen zu.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.

Die Intern -Methode verwendet den Internpool, um nach einer Zeichenfolge zu suchen, strdie dem Wert von entspricht.The Intern method uses the intern pool to search for a string equal to the value of str. Wenn eine solche Zeichenfolge vorhanden ist, wird der zugehörige Verweis im Internpool zurückgegeben.If such a string exists, its reference in the intern pool is returned. Wenn die Zeichenfolge nicht vorhanden ist, wird dem str Internalen Pool ein Verweis auf hinzugefügt. Anschließend wird dieser Verweis zurückgegeben.If the string does not exist, a reference to str is added to the intern pool, then that reference is returned.

Im folgenden Beispiel ist die Zeichenfolge S1 mit dem Wert "myTest" bereits interniert, weil es sich um ein Literalzeichen im Programm handelt.In the following example, the string s1, which has a value of "MyTest", is already interned because it is a literal in the program. Die System.Text.StringBuilder -Klasse generiert ein neues String-Objekt, das über denselben Wert wie S1 verfügt.The System.Text.StringBuilder class generates a new string object that has the same value as s1. Ein Verweis auf diese Zeichenfolge wird S2 zugewiesen.A reference to that string is assigned to s2. Die Intern -Methode sucht nach einer Zeichenfolge, die über den gleichen Wert wie S2 verfügt.The Intern method searches for a string that has the same value as s2. Da eine solche Zeichenfolge vorhanden ist, gibt die Methode denselben Verweis zurück, der S1 zugewiesen wird.Because such a string exists, the method returns the same reference that is assigned to s1. Dieser Verweis wird dann S3 zugewiesen.That reference is then assigned to s3. Verweise S1 und S2 vergleichen ungleich, da Sie auf unterschiedliche Objekte verweisen. Verweise S1 und S3 vergleichen gleich, da Sie auf dieselbe Zeichenfolge verweisen.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.

Vergleichen Sie diese Methode mit IsInterned der-Methode.Compare this method to the IsInterned method.

Überlegungen zur VersionVersion Considerations

In wird das Verhalten Intern der-Methode in den .NET Framework 1,0 und 1,1 in Bezug auf das Internalisierung der leeren Zeichenfolge wieder hergestellt. .NET Framework 3.5 Service Pack 1.NET Framework 3.5 Service Pack 1In 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. Im folgenden Beispiel wird der-Variablen str1 ein Verweis auf Emptyzugewiesen, und der-Variablen str2 wird der Verweis auf Empty zugewiesen, der durch Aufrufen der Intern -Methode nach StringBuilderder-Methodezurückgegebenwird.Objekt, dessen Wert Empty eine Zeichenfolge ist.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. Anschließend werden die in str1 und str2 enthaltenen Verweise auf Gleichheit verglichen.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	

.NET Framework 1.0.NET Framework 1.0In, .NET Framework 1.1.NET Framework 1.1und .NET Framework 3.5 SP1.NET Framework 3.5 SP1 sindstr2 und gleich. str1In 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. .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1 In und.NET Framework 3.0.NET Framework 3.0sind undstr2nicht gleich. str1In 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.

Überlegungen zur LeistungPerformance Considerations

Wenn Sie versuchen, die Gesamtmenge des Arbeitsspeichers zu verringern, die von der Anwendung zugewiesen wird, sollten Sie Bedenken, dass das Trennen einer Zeichenfolge zwei unerwünschte Nebeneffekte hat.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. Zuerst wird der für Internpool vorhanden String -Objekte zugeordnete Arbeitsspeicher wahrscheinlich erst freigegeben, wenn die Common Language Runtime (CLR) beendet wird.First, the memory allocated for interned String objects is not likely to be released until the common language runtime (CLR) terminates. Der Grund hierfür ist, dass der CLR-Verweis auf das String Internpool vorhanden-Objekt beibehalten werden kann, nachdem Ihre Anwendung oder sogar Ihre Anwendungsdomäne beendet wurde.The reason is that the CLR's reference to the interned String object can persist after your application, or even your application domain, terminates. Zweitens müssen Sie zuerst die Zeichenfolge erstellen, um eine Zeichenfolge zu interntigen.Second, to intern a string, you must first create the string. Der Arbeitsspeicher, der String vom-Objekt verwendet wird, muss weiterhin zugeordnet werden, auch wenn der Arbeitsspeicher schließlich in eine Garbage Collection aufgenommen wird.The memory used by the String object must still be allocated, even though the memory will eventually be garbage collected.

Der .NET Framework Version 2,0 führt den CompilationRelaxations.NoStringInterning Enumerationsmember ein.The .NET Framework version 2.0 introduces the CompilationRelaxations.NoStringInterning enumeration member. Der NoStringInterning Member markiert eine Assembly als keine Zeichen folgen Literale interning.The NoStringInterning member marks an assembly as not requiring string-literal interning. Sie können mithilfe NoStringInterning des CompilationRelaxationsAttribute -Attributs auf eine Assembly anwenden.You can apply NoStringInterning to an assembly using the CompilationRelaxationsAttribute attribute. Wenn Sie den Ngen. exe (Native Image Generator) verwenden, um eine Assembly im Vorfeld der Laufzeit zu kompilieren, werden Zeichen folgen nicht über Module hinweg interniert.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.

Gilt für:

Siehe auch