String.Intern(String) String.Intern(String) String.Intern(String) String.Intern(String) Method

Определение

Извлекает системную ссылку на указанный объект 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

Параметры

str
String String String String

Строка для поиска в пуле интернирования.A string to search for in the intern pool.

Возвраты

Системная ссылка на значение str, если оно уже интернировано; в противном случае возвращается новая ссылка на строку со значением str.The system's reference to str, if it is interned; otherwise, a new reference to a string with the value of str.

Исключения

Свойство str имеет значение null.str is null.

Примеры

В следующем примере используются три строки, равные значению, чтобы определить, равны ли вновь созданная строка и интернированная строка.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
'

Комментарии

Среда CLR сохраняет хранилище строк, сохраняя таблицу, называемую пулом интернирования, которая содержит одну ссылку на каждую уникальную строку литерала, объявленную или созданную программно в программе.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. Следовательно, экземпляр литеральной строки с определенным значением встречается только один раз в системе.Consequently, an instance of a literal string with a particular value only exists once in the system.

Например, если присвоить одну и ту же строку литерала нескольким переменным, среда выполнения извлекает одну и ту же ссылку на литеральную строку из пула интернирования и назначает ее каждой переменной.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.

Метод использует пул интернирования для поиска строки, равной strзначению. InternThe Intern method uses the intern pool to search for a string equal to the value of str. Если такая строка существует, возвращается ее ссылка в пуле интернирования.If such a string exists, its reference in the intern pool is returned. Если строка не существует, в пул интернирования добавляется ссылка на str , а затем возвращается ссылка.If the string does not exist, a reference to str is added to the intern pool, then that reference is returned.

В следующем примере строка s1, имеющая значение "MyTest", уже интернирована, так как это литерал в программе.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.StringBuilder Класс создает новый строковый объект, имеющий то же значение, что и S1.The System.Text.StringBuilder class generates a new string object that has the same value as s1. Ссылка на эту строку присваивается S2.A reference to that string is assigned to s2. Intern Метод выполняет поиск строки, имеющей то же значение, что и S2.The Intern method searches for a string that has the same value as s2. Так как такая строка существует, метод возвращает ту же ссылку, которая назначена S1.Because such a string exists, the method returns the same reference that is assigned to s1. Затем эта ссылка назначается S3.That reference is then assigned to s3. Ссылки S1 и S2 не равны, так как они ссылаются на разные объекты. ссылается на равенство S1 и S3, так как они ссылаются на одну и ту же строку.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.

Сравните этот метод с IsInterned методом.Compare this method to the IsInterned method.

Рекомендации по версиямVersion Considerations

.NET Framework 3.5 с пакетом обновления 1 (SP1).NET Framework 3.5 Service Pack 1 Вметодвозвращаетсякегоповедениюв.NETFramework1,0и1,1вIntern отношении изоляции пустой строки.In the .NET Framework 3.5 с пакетом обновления 1 (SP1).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. В следующем примере переменной str1 присваивается Emptyссылка, а переменной str2 присваивается Intern ссылка Empty , которая возвращается путем вызова метода после преобразования элемента StringBuilderобъект, значение которого Empty равно строке.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. Затем ссылки, содержащиеся str1 в str2 и, сравниваются на равенство.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	

.NET Framework 1.0.NET Framework 1.0В, .NET Framework 1.1.NET Framework 1.1и и .NET Framework 3.5 SP1.NET Framework 3.5 SP1равны .str1 str2In the .NET Framework 1.0.NET Framework 1.0, .NET Framework 1.1.NET Framework 1.1, and .NET Framework 3.5 SP1.NET Framework 3.5 SP1, str1 and str2 are equal. .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1 В .NET Framework 3.0.NET Framework 3.0 ииstr2 не равны.str1In the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1 and .NET Framework 3.0.NET Framework 3.0, str1 and str2 are not equal.

Особенности производительностиPerformance Considerations

Если вы пытаетесь уменьшить общий объем памяти, выделяемой для приложения, помните, что интернирование строки имеет два нежелательных побочных эффекта.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. Во-первых, память, выделенная String для интернированных объектов, скорее всего, не будет освобождена до тех пор, пока не завершится работа среды CLR.First, the memory allocated for interned String objects is not likely to be released until the common language runtime (CLR) terminates. Причина заключается в том, что ссылка CLR на интернированный String объект может сохраняться после завершения приложения или даже домена приложения.The reason is that the CLR's reference to the interned String object can persist after your application, or even your application domain, terminates. Во-вторых, для интернирования строки необходимо сначала создать строку.Second, to intern a string, you must first create the string. Память, используемая String объектом, по-прежнему должна быть выделена, даже несмотря на то, что память в конечном итоге будет собираться сборщиком мусора.The memory used by the String object must still be allocated, even though the memory will eventually be garbage collected.

В .NET Framework версии 2,0 появился CompilationRelaxations.NoStringInterning элемент перечисления.The .NET Framework version 2.0 introduces the CompilationRelaxations.NoStringInterning enumeration member. NoStringInterning Член помечает сборку как не требует интернирования строкового литерала.The NoStringInterning member marks an assembly as not requiring string-literal interning. Можно применить NoStringInterning к сборке CompilationRelaxationsAttribute с помощью атрибута.You can apply NoStringInterning to an assembly using the CompilationRelaxationsAttribute attribute. Кроме того, при использовании Ngen. exe (генератора образов в машинном кодах) для компиляции сборки в режиме предварительного выполнения строки не выдаются между модулями.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.

Применяется к

Дополнительно