Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Nota
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Runtime bahasa umum mempertahankan tabel, yang disebut kumpulan internal, yang menyimpan satu referensi untuk setiap nilai string unik. Metode ini Intern menggunakan kumpulan magang untuk mencari string yang sama dengan nilai str. Jika tidak ada string seperti itu, referensi ke str ditambahkan ke kumpulan, dan referensi tersebut dikembalikan. (Sebaliknya, metode IsInterned(String) mengembalikan sebuah referensi null jika string yang diminta tidak ada di pool intern.)
Pusat penyimpanan intern dapat digunakan oleh runtime untuk menghemat penyimpanan string. Namun, interning otomatis dari literal string tidak dijamin—tergantung pada bagaimana assembly dikompilasi dan dijalankan, beberapa literal mungkin tidak ditambahkan ke pool.
Dalam contoh berikut, string s1 memiliki nilai "MyTest". 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. Jika s1 sudah diinternalkan (misalnya, karena perakitan memerlukan interning string-literal), metode ini mengembalikan referensi yang sama dengan s1, yang kemudian ditetapkan ke s3, dan s1s3 sama dalam perbandingan. Jika tidak, entri intern baru dibuat untuk s2 dan ditetapkan ke s3, dan s1 dan s3 dianggap tidak sama. Dalam kedua kasus, s1 dan s2 tidak setara karena merujuk pada objek yang berbeda.
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. Secara bawaan, pengkompilasi C# menghasilkan CompilationRelaxationsAttribute dengan flag NoStringInterning pada setiap assembly untuk performa yang lebih baik, yang berarti literal string tidak dijamin ditambahkan ke intern pool. Anda dapat menyesuaikan NoStringInterning pada rakitan menggunakan atribut CompilationRelaxationsAttribute.
Saat Anda memublikasikan aplikasi menggunakan AOT asli, menonaktifkan NoStringInterning tidak didukung. Dengan AOT asli, literal string tidak dijamin ditambahkan ke kumpulan magang, jadi Intern mungkin tidak menemukan kecocokan untuk string yang tampaknya harfiah dalam kode sumber.