Metoda System.String.Intern

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Modul CLR (Common Language Runtime) šetří úložiště řetězců udržováním tabulky označované jako fond internů, který obsahuje jediný odkaz na každý jedinečný literálový řetězec deklarovaný nebo vytvořený programově ve vašem programu. V důsledku toho instance literálového řetězce s konkrétní hodnotou existuje pouze jednou v systému.

Pokud například přiřadíte stejný řetězec literálu několika proměnným, modul runtime načte stejný odkaz na literálový řetězec z fondu internů a přiřadí ho ke každé proměnné.

Metoda Intern používá internový fond k vyhledání řetězce, který se rovná hodnotě str. Pokud takový řetězec existuje, vrátí se jeho odkaz ve fondu internů. Pokud řetězec neexistuje, přidá se odkaz na str intern fondu, vrátí se tento odkaz.

V následujícím příkladu je řetězec s1, který má hodnotu "MyTest", již internována, protože se jedná o literál v programu. Třída System.Text.StringBuilder vygeneruje nový objekt řetězce, který má stejnou hodnotu jako s1. Odkaz na tento řetězec je přiřazen k s2. Metoda Intern vyhledá řetězec, který má stejnou hodnotu jako s2. Vzhledem k tomu, že takový řetězec existuje, vrátí metoda stejný odkaz, který je přiřazen k s1. Tento odkaz je pak přiřazen k s3. Odkazy s1 a s2 porovnávají nerovné, protože odkazují na různé objekty; odkazy s1 a s3 porovnávají stejné, protože odkazují na stejný řetězec.

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.

Porovnejte tuto metodu s metodou IsInterned .

V následujícím příkladu je proměnná str1 přiřazena odkaz na String.Emptya proměnná str2 je přiřazena odkaz na String.Empty to, který je vrácen voláním Intern metody po převodu objektu StringBuilder , jehož hodnota je String.Empty na řetězec. Pak odkazy obsažené v str1 a str2 jsou porovnány pro rovnost. str1 a str2 jsou stejné.

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

let sb = StringBuilder().Append String.Empty
let str3 = String.Intern(string sb)

if (str1 :> obj) = (str3 :> obj) then
    printfn "The strings are equal."
else
    printfn "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

Důležité informace o výkonu

Pokud se pokoušíte snížit celkové množství paměti, kterou aplikace přidělí, mějte na paměti, že prokládání řetězce má dva nežádoucí vedlejší účinky. Za prvé, paměť přidělená pro interované String objekty pravděpodobně nebude vydána, dokud modul CLR (Common Language Runtime) neukončí. Důvodem je, že odkaz CLR na interovaný String objekt může po ukončení aplikace nebo dokonce i domény aplikace zachovat. Za druhé, pokud chcete internovat řetězec, musíte nejprve vytvořit řetězec. Paměť používaná objektem String musí být stále přidělena, i když paměť bude nakonec uvolněna z paměti.

Člen CompilationRelaxations.NoStringInterning výčtu označí sestavení jako nevyžadující prolínání řetězcového literálu. Můžete použít NoStringInterning na sestavení pomocí atributu CompilationRelaxationsAttribute . Při použití Ngen.exe (Native Image Generator) ke kompilaci sestavení předem za běhu nejsou řetězce interagovány mezi moduly.