String.Intern(String) Yöntem

Tanım

Sistemin belirtilen Stringöğesine başvuruyu alır.

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

Parametreler

str
String

Stajyer havuzunda aranacak dize.

Döndürülenler

Sistemin için başvurusu str, interned ise, aksi takdirde değeriyle strbir dizeye yeni bir başvurudur.

Özel durumlar

str, null'e eşittir.

Örnekler

Aşağıdaki örnek, eşit değerlere sahip iki dize oluşturur ve bunları içlerine alma işleminin aynı başvuruyu verdiğini gösterir.

// 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
'

Açıklamalar

! [NOT] >String.Intern Eşit değerlere sahip iki dizenin aynı interned başvuruyu döndürmesini garanti eder, ancak döndürülen başvurunun dize değişmez değeriyle aynı olduğunu garanti etmez.

        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.)

Dize depolama alanını korumak için stajyer havuzu çalışma zamanı tarafından kullanılabilir. Ancak, dize değişmez değerlerinin otomatik olarak devredilmesi garanti değildir; derlemenin nasıl derlendiğine ve yürütülebileceğine bağlı olarak, bazı değişmez değerler havuza eklenmeyebilir.

Aşağıdaki örnekte, dize s1 "MyTest" değerine sahiptir. sınıfı ile System.Text.StringBuilder aynı değere s1sahip yeni bir dize nesnesi oluşturur. Bu dizeye bir başvuru öğesine s2atanır. yöntemi ile Intern aynı değere s2sahip bir dize arar. s1 zaten interned ise (örneğin, derleme dize değişmezleri interning gerektirdiğinden), yöntem s1 ile aynı başvuruyu döndürür, bu da s3'ye atanır ve s1 ile s3 eşit olarak karşılaştırılır. Aksi takdirde, s2 için yeni bir interned girişi oluşturulur ve s3'e atanır. Ayrıca, s1 ve s3 eşit olmadıkları için karşılaştırılır. Her iki durumda da, s1 ve s2, farklı nesnelere başvurdukları için eşit olmadıkları sonucuna varılır.

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.

Performansla ilgili dikkat edilmesi gerekenler

Uygulamanızın ayırdığı toplam bellek miktarını azaltmaya çalışıyorsanız, dizeyi aktarmanın iki istenmeyen yan etkisi olduğunu unutmayın. İlk olarak, ortak dil çalışma zamanı (CLR) sonlandırılana kadar, interned String nesneler için ayrılan belleğin serbest bırakılması olası değildir. Bunun nedeni, CLR'nin interned String nesnesine başvurusunun uygulamanız veya uygulama etki alanınız sonlandırıldıktan sonra kalıcı olmasıdır. İkincisi, bir dizeyi intern yapmak için önce dizeyi oluşturmanız gerekir. Nesne tarafından String kullanılan bellek, sonunda çöp olarak toplanacak olsa bile yine de ayrılmalıdır.

CompilationRelaxations.NoStringInterning numaralandırma üyesi, bir bütünleştirilmiş kodu dize sabitlerinin yerleştirilmesini gerektirmeyen olarak işaretler. Varsayılan olarak, C# derleyicisi daha iyi performans için her derlemede bayrağıyla bir CompilationRelaxationsAttributeNoStringInterning yayar; bu da dize değişmez değerlerinin stajyer havuzuna eklenmesinin garanti edilmediği anlamına gelir. Bir derlemede NoStringInterning'yi, CompilationRelaxationsAttribute özniteliğini kullanarak özelleştirebilirsiniz.

Yerel AOT kullanarak bir uygulama yayımladığınızda kapatma NoStringInterning desteklenmez. Yerel AOT ile dize değişmez değerlerinin stajyer havuzuna eklenmesi garanti edilmediğinden, Intern kaynak kodda sabit değer gibi görünen bir dize için eşleşme bulamıyor olabilir.

Şunlara uygulanır

Ayrıca bkz.