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 bildirilen veya program aracılığıyla oluşturulan her benzersiz sabit karakter dizisine tek bir başvuru içeren ve "intern havuzu" olarak adlandırılan bir tablo tutarak dizge 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ı iç havuzdan değişmez dizeye aynı referansı alır ve her değişkene atar.

Intern yöntemi, str parametresinin değerine eşit olan bir dizeyi aramak için ara belleği kullanır. Böyle bir dize varsa, dahili havuzdaki referansı döndürülür. Dize mevcut değilse, str için bir başvuru ara havuzuna eklenir ve bu başvuru döndürülür. Buna karşılık, IsInterned(String) yöntemi, istenen dize intern havuzunda yoksa bir null referans döndürür.

Aşağıdaki örnekte, değeri "MyTest" olan s1 dizesi, programda bir değişmez değer olduğu için zaten intern edilmiş olarak sunulmaktadır. sınıfı ile System.Text.StringBuilder aynı değere s1sahip yeni bir dize nesnesi oluşturur. Bu dizeye bir başvuru öğesine s2atanır. yöntemi ile Intern aynı değere s2sahip bir dize arar. Böyle bir dize mevcut olduğundan, yöntem s1'ye atanmış olan referansı döndürür. Bu referans daha sonra s3 ögesine atanır. Referanslar s1 ve s2, farklı nesnelere başvurdukları için eşit olmayan şekilde karşılaştırılır; referanslar s1 ve s3, aynı dizeye başvurdukları için eşit karşılaştırılır.

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.

Performansla ilgili dikkat edilmesi gerekenler

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.

CompilationRelaxations.NoStringInterning numaralandırma üyesi, bir bütünleştirilmiş kodu dize sabitlerinin yerleştirilmesini gerektirmeyen olarak işaretler. NoStringInterning özniteliğini kullanarak bir derlemeye CompilationRelaxationsAttribute uygulayabilirsiniz. Ayrıca, çalışma zamanından önce bir derlemeyi derlemek için Ngen.exe (Yerel Görüntü Oluşturucu) kullandığınızda, dizeler modüller arasında ortak kullanıma sunulmaz.