Aracılığıyla paylaş


System.String.Intern yöntemi

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

Ortak dil çalışma zamanı, programınızda program aracılığıyla bildirilen veya oluşturulan her benzersiz değişmez dizeye tek bir başvuru içeren, intern havuzu olarak adlandırılan bir tablo tutarak dize depolamasını korur. Sonuç olarak, sabit dizenin belirli bir değere sahip bir örneği sistemde yalnızca bir kez bulunur.

Örneğin, aynı değişmez dizeyi birkaç değişkene atarsanız, çalışma zamanı stajyer havuzundan değişmez dizeye aynı başvuruyu alır ve her değişkene atar.

yöntemi, Intern değerine streşit bir dize aramak için stajyer havuzunu kullanır. Böyle bir dize varsa, stajyer havuzundaki başvurusu döndürülür. Dize yoksa, için bir başvuru str stajyer havuzuna eklenir ve bu başvuru döndürülür.

Aşağıdaki örnekte, "MyTest" değerine sahip olan s1 dizesi, programda bir değişmez değer olduğundan zaten interned olmuştur. sınıfı, System.Text.StringBuilder s1 ile aynı değere sahip yeni bir dize nesnesi oluşturur. Bu dizeye bir başvuru s2'ye atanır. yöntemi, Intern s2 ile aynı değere sahip bir dize arar. Böyle bir dize mevcut olduğundan, yöntemi s1'e atanan başvuruyu döndürür. Bu başvuru daha sonra s3'e atanır. S1 ve s2 başvuruları, farklı nesnelere başvuracakları için eşit olmayanları karşılaştırır; başvurular s1 ve s3 eşittir, çünkü aynı dizeye başvururlar.

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.

Bu yöntemi yöntemiyle karşılaştırın IsInterned .

Aşağıdaki örnekte değişkene str1String.Emptyöğesine bir başvuru atanır ve değeri str2String.Empty dize olan bir StringBuilder nesne dönüştürüldükten sonra yöntemi çağrılarak Intern döndürülen değişkenine başvuru String.Empty atanır. Daha sonra içinde bulunan str1 ve str2 başvuruları eşitlik için karşılaştırılır. str1 ve str2 eşittir.

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

Performans değerlendirmeleri

Uygulamanızın ayırdığı toplam bellek miktarını azaltmaya çalışıyorsanız, dizeyi aktarmanın iki istenmeyen yan etkisi olduğunu unutmayın. İlk olarak, ortak dil çalışma zamanı (CLR) sonlandırılana kadar, interned String nesneler için ayrılan belleğin serbest bırakılması olası değildir. Bunun nedeni, CLR'nin interned String nesnesine başvurusunun uygulamanız veya uygulama etki alanınız sonlandırıldıktan sonra kalıcı olmasıdır. İkincisi, bir dizeyi intern yapmak için önce dizeyi oluşturmanız gerekir. Nesne tarafından String kullanılan bellek, sonunda çöp olarak toplanacak olsa bile yine de ayrılmalıdır.

Numaralandırma CompilationRelaxations.NoStringInterning üyesi, bir derlemeyi dize değişmez değerli interning gerektirmeyen olarak işaretler. özniteliğini kullanarak bir derlemeye CompilationRelaxationsAttribute uygulayabilirsinizNoStringInterning. Ayrıca, çalışma zamanından önce bir derleme derlemek için Ngen.exe (Yerel Görüntü Oluşturucu) kullandığınızda, dizeler modüller arasında geçiş yapılmaz.