String.Intern(String) Metode

Definisi

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.Intern menjamin 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.

Berlaku untuk

Lihat juga