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 str
eş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 str1
String.Emptyöğesine bir başvuru atanır ve değeri str2
String.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.