Methode System.String.Intern

Opmerking

In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.

De algemene taalruntime onderhoudt een tabel, de internpool genaamd, die één verwijzing bevat voor elke unieke tekenreekswaarde. De Intern methode gebruikt de interne pool om te zoeken naar een tekenreeks die gelijk is aan de waarde van str. Als er geen dergelijke tekenreeks bestaat, wordt er een verwijzing naar str aan de pool toegevoegd en wordt die verwijzing geretourneerd. Daarentegen retourneert de IsInterned(String) methode een nulverwijzing als de aangevraagde tekenreeks niet bestaat in de intern-pool.

De interne pool kan door de runtime worden gebruikt om tekenreeksopslag te besparen. Automatische internering van letterlijke tekenreeksen wordt echter niet gegarandeerd, afhankelijk van de manier waarop de assembly is gecompileerd en uitgevoerd, sommige letterlijke gegevens worden mogelijk niet toegevoegd aan de pool.

In het volgende voorbeeld heeft de tekenreeks s1 de waarde 'MyTest'. De System.Text.StringBuilder klasse genereert een nieuw tekenreeksobject met dezelfde waarde als s1. Er wordt een verwijzing naar die tekenreeks toegewezen aan s2. De Intern methode zoekt naar een tekenreeks met dezelfde waarde als s2. Als s1 al geïnterneerd was (bijvoorbeeld omdat de assembly internering van letterlijke tekenreeksen vereist), retourneert de methode dezelfde verwijzing als s1, die vervolgens wordt toegewezen aan s3, en s1 en s3 zijn gelijk. Anders wordt er een nieuwe interne vermelding gemaakt voor s2 en toegewezen aan s3, en s1 en s3 vergelijken ongelijk. In beide gevallen vergelijken s1 en s2 ongelijk omdat ze naar verschillende objecten verwijzen.

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.
let s1 = "MyTest"
let s2 = StringBuilder().Append("My").Append("Test").ToString()
let s3 = String.Intern s2
printfn $"{s2 :> obj = s1 :> obj}" // Different references.
printfn $"{s3 :> obj = s1 :> obj}" // 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.

Prestatie-overwegingen

Als u de totale hoeveelheid geheugen wilt verminderen die uw toepassing toewijst, moet u er rekening mee houden dat het interneren van een tekenreeks twee ongewenste bijwerkingen heeft. Ten eerste wordt het geheugen dat is toegewezen voor interne String objecten waarschijnlijk pas vrijgegeven als de COMMON Language Runtime (CLR) wordt beëindigd. De reden hiervoor is dat de verwijzing van de CLR naar het interne String object kan blijven bestaan nadat uw toepassing, of zelfs uw toepassingsdomein, wordt beëindigd. Ten tweede, om een string te internaliseren, moet je eerst de string creëren. Het geheugen dat door het String object wordt gebruikt, moet nog steeds worden toegewezen, ook al zal het uiteindelijk door de vuilnisbakverzameling worden verzameld.

Het CompilationRelaxations.NoStringInterning opsommingslid markeert een assembly als een waarbij geen tekenreeksinternering is vereist. Standaard verzendt de C#-compiler een CompilationRelaxationsAttribute vlag met de NoStringInterning vlag op elke assembly voor betere prestaties, wat betekent dat letterlijke tekenreeksen niet gegarandeerd aan de interne pool worden toegevoegd. U kunt NoStringInterning op een assembly aanpassen met behulp van het CompilationRelaxationsAttribute kenmerk.

Wanneer u een app publiceert met systeemeigen AOT, wordt het uitschakelen NoStringInterning niet ondersteund. Met "native AOT" is het niet gegarandeerd dat letterlijke tekenreeksen worden toegevoegd aan de interne pool, dus Intern kan mogelijk geen overeenkomst vinden voor een tekenreeks die in de broncode als letterlijk lijkt.