String.Intern-Methode
Ruft den Verweis des Systems auf den angegebenen String ab.
Namespace: System
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
Public Shared Function Intern ( _
str As String _
) As String
'Usage
Dim str As String
Dim returnValue As String
returnValue = String.Intern(str)
public static string Intern (
string str
)
public:
static String^ Intern (
String^ str
)
public static String Intern (
String str
)
public static function Intern (
str : String
) : String
Parameter
- str
Ein String.
Rückgabewert
Wenn der Wert von str bereits im Internpool vorhanden ist, wird der Verweis des Systems zurückgegeben, andernfalls wird ein neuer Verweis auf eine Zeichenfolge mit dem Wert von str zurückgegeben.
Ausnahmen
Ausnahmetyp | Bedingung |
---|---|
str ist NULL (Nothing in Visual Basic). |
Hinweise
Die Common Language Runtime behält den Speicherplatz von Zeichenfolgen durch Verwalten einer Tabelle bei, die als Internpool bezeichnet wird und einen Verweis auf jedes eindeutige Zeichenfolgenliteral enthält, das im Programm deklariert oder programmgesteuert erstellt wurde. Daher ist eine Instanz eines Zeichenfolgenliterals mit einem bestimmten Wert nur einmal im System vorhanden.
Wenn Sie z. B. dasselbe Zeichenfolgenliteral mehreren Variablen zuweisen, ruft die Common Language Runtime denselben Verweis für das Zeichenfolgenliteral aus dem Internpool ab und weist ihn jeder Variablen zu.
Die Intern-Methode verwendet den Internpool zum Suchen einer Zeichenfolge, die dem Wert von str entspricht. Wenn eine solche Zeichenfolge vorhanden ist, wird ihr Verweis im Internpool zurückgegeben. Wenn die Zeichenfolge nicht vorhanden ist, wird dem Internpool ein Verweis auf str hinzugefügt und dann dieser Verweis zurückgegeben.
Im folgenden C#-Beispiel ist die Zeichenfolge s1 mit dem Wert "MyTest" bereits im Internpool vorhanden, da es sich um ein Literal im Programm handelt.
Die System.Text.StringBuilder-Klasse generiert ein neues Zeichenfolgenobjekt mit demselben Wert wie s1. Ein Verweis auf diese Zeichenfolge wird s2 zugewiesen.
Die Intern-Methode sucht nach einer Zeichenfolge, die demselben Wert hat wie s2. Da eine solche Zeichenfolge vorhanden ist, gibt die Methode denselben Verweis zurück, der s1 zugeordnet ist. Anschließend wird dieser Verweis s3 zugewiesen.
Die Verweise s1 und s2 sind ungleich, da sie auf unterschiedliche Objekte verweisen, wohingegen die Verweise s1 und s3 gleich sind, da sie auf dieselbe Zeichenfolge verweisen.
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.
Vergleichen Sie diese Methode mit der IsInterned-Methode.
Versionsaspekte
Ab .NET Framework, Version 2.0, hat sich das Verhalten der Intern-Methode geändert. In der folgenden C#-Codesequenz wird der Variablen str1
ein Verweis auf Empty und der Variablen str2
der Verweis auf Empty zugewiesen, der von der Intern-Methode zurückgegeben wird. Anschließend werden str1
und str2
auf Gleichheit geprüft.
string str1 = String.Empty;
string str2 = String.Intern(String.Empty);
if ((object) str1) == ((object) str2) …
In .NET Framework, Version 1.1, sind str1
und str2
nicht gleich, in .NET Framework, Version 2.0, sind str1
und str2
hingegen gleich.
Leistungsaspekte
Wenn Sie versuchen, die gesamte für die Anwendung reservierte Speichermenge zu verringern, dass das Internalisieren von Zeichenfolgen zwei unerwünschte Nebeneffekte hat. Zunächst wird der für internalisierte String-Objekte reservierte Speicher wahrscheinlich erst nach Beenden der Common Language Runtime (CLR) freigegeben. Der Grund dafür besteht darin, dass der Verweis der CLR auf das internalisierte String-Objekt auch nach Beenden der Anwendung oder sogar der Anwendungsdomäne beibehalten werden kann. Des weiteren muss eine Zeichenfolge zunächst erstellt werden, um internalisiert werden zu können. Der vom String-Objekt verwendete Speicher muss dennoch reserviert werden, auch wenn der Speicher schließlich durch die Garbage Collection freigegeben wird.
Beispiel
Im folgenden Codebeispiel werden drei Zeichenfolgen mit dem gleichen Wert verwendet, um zu bestimmen, ob eine neu erstellte Zeichenfolge und eine internalisierte Zeichenfolge gleich sind.
' 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
'
// 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)
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)
import System.*;
import System.Text.*;
class Sample
{
public static void main(String[] args)
{
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}",
System.Convert.ToString((Object)s2 == (Object)s1));
Console.WriteLine("Is s3 the same reference as s1?: {0}",
System.Convert.ToString((Object)s3 == (Object)s1));
} //main
} //Sample
/*
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
*/
Plattformen
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
.NET Compact Framework
Unterstützt in: 2.0, 1.0