String.Intern(String) Metoda

Definicja

Pobiera odwołanie systemu do określonego String .Retrieves the system's reference to the specified 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

Parametry

str
String

Ciąg do wyszukania w puli InterNIC.A string to search for in the intern pool.

Zwraca

String

Odwołanie systemu do str , jeśli jest InterNIC; w przeciwnym razie, nowe odwołanie do ciągu z wartością str .The system's reference to str, if it is interned; otherwise, a new reference to a string with the value of str.

Wyjątki

str to null.str is null.

Przykłady

W poniższym przykładzie są używane trzy ciągi, które są równe wartości, aby określić, czy nowo utworzony ciąg i ciąg z ośrodeku InterNIC są równe.The following example uses three strings that are equal in value to determine whether a newly created string and an interned string are equal.

// Sample for String::Intern(String)
using namespace System;
using namespace System::Text;
int main()
{
   String^ s1 = "MyTest";
   String^ s2 = (gcnew StringBuilder)->Append( "My" )->Append( "Test" )->ToString();
   String^ s3 = String::Intern( s2 );
   Console::WriteLine( "s1 == '{0}'", s1 );
   Console::WriteLine( "s2 == '{0}'", s2 );
   Console::WriteLine( "s3 == '{0}'", s3 );
   Console::WriteLine( "Is s2 the same reference as s1?: {0}", s2 == s1 );
   Console::WriteLine( "Is s3 the same reference as s1?: {0}", s3 == s1 );
}

/*
This example produces the following results:
s1 == 'MyTest'
s2 == 'MyTest'
s3 == 'MyTest'
Is s2 the same reference as s1?: False
Is s3 the same reference as s1?: True
*/
// Sample for String.Intern(String)
using System;
using System.Text;

class Sample
{
    public static void Main()
    {
        string s1 = "MyTest";
        string s2 = new StringBuilder().Append("My").Append("Test").ToString();
        string s3 = String.Intern(s2);
        Console.WriteLine($"s1 == {s1}");
        Console.WriteLine($"s2 == {s2}");
        Console.WriteLine($"s3 == {s3}");
        Console.WriteLine($"Is s2 the same reference as s1?: {(Object)s2 == (Object)s1}");
        Console.WriteLine($"Is s3 the same reference as s1?: {(Object)s3 == (Object)s1}");
    }
}
/*
This example produces the following results:
s1 == MyTest
s2 == MyTest
s3 == MyTest
Is s2 the same reference as s1?: False
Is s3 the same reference as s1?: True
*/
Imports System.Text

Class Sample

    Public Shared Sub Main()
        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($"s1 = {s1}")
        Console.WriteLine($"s2 = {s2}")
        Console.WriteLine($"s3 = {s3}")
        Console.WriteLine($"Is s2 the same reference as s1?: {s2 Is s1}")
        Console.WriteLine($"Is s3 the same reference as s1?: {s3 Is s1}")
    End Sub
End Class
'
's1 = MyTest
's2 = MyTest
's3 = MyTest
'Is s2 the same reference as s1?: False
'Is s3 the same reference as s1?: True
'

Uwagi

Środowisko uruchomieniowe języka wspólnego chroni magazyn ciągów przez utrzymywanie tabeli zwanej pulą InterNIC, która zawiera pojedyncze odwołanie do każdego unikatowego ciągu literału zadeklarowanego lub utworzonego programowo w programie.The common language runtime conserves string storage by maintaining a table, called the intern pool, that contains a single reference to each unique literal string declared or created programmatically in your program. W związku z tym wystąpienie ciągu literału z określoną wartością występuje tylko raz w systemie.Consequently, an instance of a literal string with a particular value only exists once in the system.

Jeśli na przykład ten sam ciąg literału zostanie przypisany do kilku zmiennych, środowisko uruchomieniowe pobiera te same odwołania do ciągu literału z puli InterNIC i przypisuje je do każdej zmiennej.For example, if you assign the same literal string to several variables, the runtime retrieves the same reference to the literal string from the intern pool and assigns it to each variable.

InternMetoda używa puli stażyst do wyszukiwania ciągu równego wartości str .The Intern method uses the intern pool to search for a string equal to the value of str. Jeśli taki ciąg istnieje, zwracane jest jego odwołanie w puli stażyst.If such a string exists, its reference in the intern pool is returned. Jeśli ciąg nie istnieje, odwołanie do str jest dodawane do puli InterNIC, to odwołanie zostanie zwrócone.If the string does not exist, a reference to str is added to the intern pool, then that reference is returned.

W poniższym przykładzie ciąg S1, który ma wartość ". test", został już wybadany, ponieważ jest to literał w programie.In the following example, the string s1, which has a value of "MyTest", is already interned because it is a literal in the program. System.Text.StringBuilderKlasa generuje nowy obiekt ciągu, który ma taką samą wartość jak S1.The System.Text.StringBuilder class generates a new string object that has the same value as s1. Odwołanie do tego ciągu jest przypisane do S2.A reference to that string is assigned to s2. InternMetoda wyszukuje ciąg, który ma taką samą wartość jak S2.The Intern method searches for a string that has the same value as s2. Ponieważ taki ciąg istnieje, metoda zwraca takie samo odwołanie, które jest przypisane do S1.Because such a string exists, the method returns the same reference that is assigned to s1. To odwołanie jest następnie przypisywane do S3.That reference is then assigned to s3. Odwołania S1 i S2 są nierówne, ponieważ odwołują się do różnych obiektów; odwołuje się do porównania S1 i S3 równego, ponieważ odwołują się do tego samego ciągu.References s1 and s2 compare unequal because they refer to different objects; references s1 and s3 compare equal because they refer to the same string.

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

Porównaj tę metodę z IsInterned metodą.Compare this method to the IsInterned method.

Uwagi dotyczące wersjiVersion considerations

W programie .NET Framework 3.5 z dodatkiem Service Pack 1.NET Framework 3.5 Service Pack 1 Intern Metoda przywraca swoje zachowanie w .NET Framework 1,0 i 1,1 w odniesieniu do InterNIC pusty ciąg.In the .NET Framework 3.5 z dodatkiem Service Pack 1.NET Framework 3.5 Service Pack 1, the Intern method reverts to its behavior in the .NET Framework 1.0 and 1.1 with regard to interning the empty string. W poniższym przykładzie zmienna str1 otrzymuje odwołanie do Empty , a zmienna str2 jest przypisana odwołanie do, Empty które jest zwracane przez wywołanie Intern metody po konwersji StringBuilder obiektu, którego wartością jest Empty ciąg.In the following example, the variable str1 is assigned a reference to Empty, and the variable str2 is assigned the reference to Empty that is returned by calling the Intern method after converting a StringBuilder object whose value is Empty to a string. Następnie odwołania zawarte w str1 i str2 są porównywane pod kątem równości.Then the references contained in str1 and str2 are compared for equality.

string str1 = String.Empty;
string str2 = String.Empty;

StringBuilder sb = new StringBuilder().Append(String.Empty);
str2 = String.Intern(sb.ToString());	

if((object)str1==(object)str2)
    Console.WriteLine("The strings are equal.");
else
    Console.WriteLine("The strings are not equal.");
Dim str1 As String = String.Empty
Dim str2 As String = String.Empty

Dim sb As StringBuilder = New StringBuilder().Append(String.Empty)
str2 = String.Intern(sb.ToString())	

If CObj(str1) Is CObj(str2) Then
    Console.WriteLine("The strings are equal.")
Else
    Console.WriteLine("The strings are not equal.")
End If

W .NET Framework 2.0 z dodatkiem Service Pack 1.NET Framework 2.0 Service Pack 1 i i .NET Framework 3.0.NET Framework 3.0 str1 str2 nie są równe.In the .NET Framework 2.0 z dodatkiem Service Pack 1.NET Framework 2.0 Service Pack 1 and .NET Framework 3.0.NET Framework 3.0, str1 and str2 are not equal. We wszystkich innych wersjach str1 i str2 jest równe.In all other versions, str1 and str2 are equal.

Zagadnienia dotyczące wydajnościPerformance Considerations

Jeśli próbujesz zmniejszyć łączną ilość pamięci przydzielonej przez aplikację, pamiętaj, że informowanie ciągu ma dwa niepożądane skutki uboczne.If you are trying to reduce the total amount of memory your application allocates, keep in mind that interning a string has two unwanted side effects. Po pierwsze pamięć przydzielona dla obiektów InterNIC String nie może zostać wydana do momentu zakończenia środowiska uruchomieniowego języka wspólnego (CLR).First, the memory allocated for interned String objects is not likely to be released until the common language runtime (CLR) terminates. Przyczyną jest to, że odwołanie środowiska CLR do obiektu InterNIC String może być utrwalane po aplikacji, a nawet w domenie aplikacji kończy się.The reason is that the CLR's reference to the interned String object can persist after your application, or even your application domain, terminates. Po drugie, aby InterNIC ciąg, należy najpierw utworzyć ciąg.Second, to intern a string, you must first create the string. Pamięć używana przez String obiekt musi nadal być przydzielone, nawet jeśli pamięć zostanie ostatecznie zebrana.The memory used by the String object must still be allocated, even though the memory will eventually be garbage collected.

W .NET Framework w wersji 2,0 wprowadzono CompilationRelaxations.NoStringInterning element członkowski wyliczenia.The .NET Framework version 2.0 introduces the CompilationRelaxations.NoStringInterning enumeration member. NoStringInterningElement członkowski oznacza zestaw jako niewymagający, aby InterNIC literał ciągu.The NoStringInterning member marks an assembly as not requiring string-literal interning. Można zastosować NoStringInterning do zestawu przy użyciu CompilationRelaxationsAttribute atrybutu.You can apply NoStringInterning to an assembly using the CompilationRelaxationsAttribute attribute. Ponadto w przypadku używania Ngen.exe (Generator obrazu natywnego) do kompilowania zestawu z wyprzedzeniem czasu wykonywania ciągi nie są InterNIC między modułami.Also, when you use the Ngen.exe (Native Image Generator) to compile an assembly in advance of run time, strings are not interned across modules.

Dotyczy

Zobacz też