Bagikan melalui


Metode System.String.Intern

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Runtime bahasa umum menghemat penyimpanan string dengan mempertahankan tabel, yang disebut kumpulan magang, yang berisi referensi tunggal untuk setiap string harfiah unik yang dideklarasikan atau dibuat secara terprogram dalam program Anda. Akibatnya, instans string harfiah dengan nilai tertentu hanya ada sekali dalam sistem.

Misalnya, jika Anda menetapkan string literal yang sama ke beberapa variabel, runtime mengambil referensi yang sama ke string literal dari kumpulan magang dan menetapkannya ke setiap variabel.

Metode ini Intern menggunakan kumpulan magang untuk mencari string yang sama dengan nilai str. Jika string seperti itu ada, referensinya di kumpulan magang dikembalikan. Jika string tidak ada, referensi ke str ditambahkan ke kumpulan magang, maka referensi tersebut dikembalikan.

Dalam contoh berikut, string s1, yang memiliki nilai "MyTest", sudah diinternasi karena merupakan harfiah dalam program. Kelas System.Text.StringBuilder menghasilkan objek string baru yang memiliki nilai yang sama dengan s1. Referensi ke string tersebut ditetapkan ke s2. Metode Intern ini mencari string yang memiliki nilai yang sama dengan s2. Karena string seperti itu ada, metode mengembalikan referensi yang sama yang ditetapkan ke s1. Referensi tersebut kemudian ditetapkan ke s3. Referensi s1 dan s2 membandingkan yang tidak sama karena merujuk ke objek yang berbeda; referensi s1 dan s3 dibandingkan sama karena merujuk ke string yang sama.

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.

Bandingkan metode ini dengan IsInterned metode .

Dalam contoh berikut, variabel str1 diberi referensi ke String.Empty, dan variabel str2 diberi referensi ke String.Empty yang dikembalikan dengan memanggil Intern metode setelah mengonversi StringBuilder objek yang nilainya menjadi String.Empty string. Kemudian referensi yang terkandung dalam str1 dan str2 dibandingkan dengan kesetaraan. str1 dan str2 sama.

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

Pertimbangan performa

Jika Anda mencoba mengurangi jumlah total memori yang dialokasikan aplikasi Anda, perlu diingat bahwa interning string memiliki dua efek samping yang tidak diinginkan. Pertama, memori yang dialokasikan untuk objek magang String tidak mungkin dirilis sampai runtime bahasa umum (CLR) berakhir. Alasannya adalah bahwa referensi CLR ke objek magang String dapat bertahan setelah aplikasi Anda, atau bahkan domain aplikasi Anda, berakhir. Kedua, untuk magang string, Anda harus terlebih dahulu membuat string. Memori yang String digunakan oleh objek masih harus dialokasikan, meskipun memori pada akhirnya akan menjadi sampah yang dikumpulkan.

Anggota CompilationRelaxations.NoStringInterning enumerasi menandai perakitan karena tidak memerlukan interning string-literal. Anda dapat menerapkan NoStringInterning ke assembly menggunakan CompilationRelaxationsAttribute atribut . Selain itu, ketika Anda menggunakan Ngen.exe (Native Image Generator) untuk mengkompilasi assembly sebelum run time, string tidak diinternasi di seluruh modul.