Bagikan melalui


Metode System.String.Intern

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

Runtime bahasa umum menghemat penyimpanan string dengan menjaga tabel yang disebut intern pool, yang berisi referensi tunggal untuk setiap literal string 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 mengakses referensi yang sama ke string literal dari kumpulan intern dan menetapkannya ke setiap variabel.

Metode Intern ini menggunakan kumpulan string internal untuk mencari string yang sama dengan nilai parameternya, str. Jika string seperti itu ada, referensinya di kumpulan magang dikembalikan. Jika string tidak ada, referensi ke str ditambahkan ke kumpulan referensi, kemudian referensi tersebut dikembalikan. (Sebaliknya, metode IsInterned(String) mengembalikan sebuah referensi null jika string yang diminta tidak ada di pool intern.)

Dalam contoh berikut, string s1, yang memiliki nilai "MyTest", sudah diinternalkan karena merupakan literal 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 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 tidak sama karena merujuk ke objek yang berbeda; referensi s1 dan s3 membandingkan sama karena mereka merujuk pada objek 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.

Pertimbangan performa

Jika Anda mencoba mengurangi jumlah total memori yang dialokasikan aplikasi Anda, perlu diingat bahwa melakukan internisasi sebuah string memiliki dua efek samping yang tidak diinginkan. Pertama, memori yang dialokasikan untuk objek dalam ruang penyimpanan khusus String tidak mungkin dilepaskan sampai waktu proses 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 menginternkan string, Anda harus terlebih dahulu membuat string. Memori yang digunakan oleh objek String harus tetap dialokasikan, meskipun pada akhirnya akan dilakukan pengumpulan sampah terhadap memori tersebut.

Anggota CompilationRelaxations.NoStringInterning enumerasi menandai assemblasi sebagai 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 runtime, string tidak diinternasi di seluruh modul.