String.Intern(String) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mengambil referensi sistem ke yang ditentukan String.
public:
static System::String ^ Intern(System::String ^ str);
public static string Intern(string str);
static member Intern : string -> string
Public Shared Function Intern (str As String) As String
Parameter
- str
- String
String yang akan dicari di kumpulan magang.
Mengembalikan
Referensi sistem ke str, jika diinternasi; jika tidak, referensi baru ke string dengan nilai str.
Pengecualian
str adalah null.
Contoh
Contoh berikut membuat dua string dengan nilai yang sama dan menunjukkan bahwa intering mereka menghasilkan referensi yang sama.
// Sample for String.Intern(String)
using System;
using System.Text;
class Sample
{
public static void Main()
{
string s1 = new StringBuilder().Append("My").Append("Test").ToString();
string s2 = new StringBuilder().Append("My").Append("Test").ToString();
Console.WriteLine($"s1 == {s1}");
Console.WriteLine($"s2 == {s2}");
Console.WriteLine($"Are s1 and s2 equal in value? {s1 == s2}");
Console.WriteLine($"Are s1 and s2 the same reference? {Object.ReferenceEquals(s1, s2)}");
string i1 = String.Intern(s1);
string i2 = String.Intern(s2);
Console.WriteLine($"After interning:");
Console.WriteLine($" Are i1 and i2 equal in value? {i1 == i2}");
Console.WriteLine($" Are i1 and i2 the same reference? {Object.ReferenceEquals(i1, i2)}");
}
}
/*
This example produces the following results:
s1 == MyTest
s2 == MyTest
Are s1 and s2 equal in value? True
Are s1 and s2 the same reference? False
After interning:
Are i1 and i2 equal in value? True
Are i1 and i2 the same reference? True
*/
// Sample for String.Intern(String)
open System
open System.Text
let s1 = StringBuilder().Append("My").Append("Test").ToString()
let s2 = StringBuilder().Append("My").Append("Test").ToString()
printfn $"s1 = {s1}"
printfn $"s2 = {s2}"
printfn $"Are s1 and s2 equal in value? {s1 = s2}"
printfn $"Are s1 and s2 the same reference? {Object.ReferenceEquals(s1, s2)}"
let i1 = String.Intern s1
let i2 = String.Intern s2
printfn "After interning:"
printfn $" Are i1 and i2 equal in value? {i1 = i2}"
printfn $" Are i1 and i2 the same reference? {Object.ReferenceEquals(i1, i2)}"
(*
This example produces the following results:
s1 = MyTest
s2 = MyTest
Are s1 and s2 equal in value? True
Are s1 and s2 the same reference? False
After interning:
Are i1 and i2 equal in value? True
Are i1 and i2 the same reference? True
*)
Imports System.Text
Class Sample
Public Shared Sub Run()
Dim s1 As String = New StringBuilder().Append("My").Append("Test").ToString()
Dim s2 As String = New StringBuilder().Append("My").Append("Test").ToString()
Console.WriteLine($"s1 = {s1}")
Console.WriteLine($"s2 = {s2}")
Console.WriteLine($"Are s1 and s2 equal in value? {s1 = s2}")
Console.WriteLine($"Are s1 and s2 the same reference? {s1 Is s2}")
Dim i1 As String = String.Intern(s1)
Dim i2 As String = String.Intern(s2)
Console.WriteLine("After interning:")
Console.WriteLine($" Are i1 and i2 equal in value? {i1 = i2}")
Console.WriteLine($" Are i1 and i2 the same reference? {i1 Is i2}")
End Sub
End Class
'
's1 = MyTest
's2 = MyTest
'Are s1 and s2 equal in value? True
'Are s1 and s2 the same reference? False
'After interning:
' Are i1 and i2 equal in value? True
' Are i1 and i2 the same reference? True
'
Keterangan
! [CATATAN] > Meskipun
String.Internmenjamin bahwa dua string dengan nilai yang sama mengembalikan referensi magang yang sama, itu tidak menjamin bahwa referensi yang dikembalikan sama dengan string literal.
The common language runtime maintains a table, called the *intern pool*, that holds a single reference for each unique string value. The <xref:System.String.Intern*> method uses the intern pool to search for a string equal to the value of `str`. If no such string exists, a reference to `str` is added to the pool, and that reference is returned. (In contrast, the <xref:System.String.IsInterned(System.String)> method returns a null reference if the requested string doesn't exist in the intern pool.)
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.