Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.
Modul CLR (Common Language Runtime) šetří místo pro řetězce udržováním tabulky označované jako interní fond, 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 řetězec literálu z interního fondu a přiřadí ho každé proměnné.
Metoda Intern používá internovací pool k vyhledání řetězce, který se rovná hodnotě svého parametru, str. Pokud takový řetězec existuje, vrátí se jeho odkaz ve fondu internů. Pokud řetězec neexistuje, přidá se odkaz na str do interního fondu, poté se vrátí tento odkaz. (Naproti tomu metoda IsInterned(String) vrátí odkaz null, pokud požadovaný řetězec neexistuje v interním fondu.)
V následujícím příkladu je řetězec s1, který má hodnotu "MyTest", již internován, 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 s1. Tento odkaz je pak přiřazen k s3. Odkazy s1 a s2 jsou nerovné, protože odkazují na různé objekty; odkazy s1 a s3 jsou 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.
Důležité informace o výkonu
Pokud se pokoušíte snížit celkovou velikost paměti, kterou aplikace přidělí, mějte na paměti, že prokládání řetězce má dva nežádoucí vedlejší účinky. Nejprve, paměť přidělená pro interované String objekty pravděpodobně nebude vydána, dokud CLR (Common Language Runtime) neukončí. Důvodem je, že odkaz CLR na interovaný String objekt může přetrvat i po ukončení vaší aplikace nebo dokonce domény aplikace. Za druhé, pokud chcete internovat řetězec, musíte nejprve vytvořit řetězec. Paměť využívaná objektu String musí být stále přidělena, i přesto že bude nakonec uvolněna procesem garbage collection.
Č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 (Generátor nativních imagí) ke kompilaci sestavení před spuštěním nejsou řetězce internovány napříč moduly.