Обновлен:
Июль 2008
Извлекает системную ссылку на указанный объект String.
Пространство имен:
System
Сборка:
mscorlib (в mscorlib.dll)
Язык Visual Basic (Объявление)
Public Shared Function Intern ( _
str As String _
) As String
Язык Visual Basic (Использование)
Dim str As String
Dim returnValue As String
returnValue = String.Intern(str)
public static string Intern(
string str
)
public:
static String^ Intern(
String^ str
)
public static String Intern(
String str
)
public static function Intern(
str : String
) : String
Возвращаемое значение
Тип:
System..::.String
Если значение str уже интернировано, возвращается системная ссылка, в противном случае, возвращается новая ссылка на строку со значением str.
| Исключение | Условие |
|---|
| ArgumentNullException |
Параметр str имеет значение nullNothingnullptrссылка null (Nothing в Visual Basic).
|
Среда CLR экономит пространство для хранения строк, ведя таблицу, называемую пулом интернирования, которая содержит по одной ссылке на каждый уникальный строковый литерал, объявленный или созданный в программе. В результате экземпляр строкового литерала с определенным значением является единственным существующим в системе.
Например, если один и тот же строковый литерал присвоить различным переменным, то среда выполнения извлечет одну и ту же ссылку на литерал из пула интернирования и присвоит ее каждой переменной.
Метод Intern использует пул интернирования для поиска строки, равной значению str. Если такая строка существует, то возвращается ссылка на нее в пуле интернирования. Если эта строка отсутствует, ссылка на str добавляется в пул интернирования, а затем эта ссылка возвращается.
В следующем примере строка s1 со значением "MyTest", уже интернирована, так как она является литералом в программе. Класс System.Text..::.StringBuilder генерирует новый строковый объект, значение которого совпадает со значением s1. Ссылка на эту строку присваивается s2. Метод Intern выполняет поиск строки, значение которой совпадает со значением s2. Поскольку такая строка существует, метод возвращает ту же ссылку, которая была присвоена s1. Эта ссылка затем присваивается s3. Ссылки s1 и s2 не считаются равными, так как они указывают на разные объекты; ссылки s1 и s3 считаются равными, так как они указывают на одну и ту же строку.
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.
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.
Сравните этот метод с методом IsInterned.
Вопросы, связанные с версиями
В .NET Framework, версия 3.5 с пакетом обновления 1 метод Intern возвращается к своему поведению в .NET Framework, версия 1.0 и .NET Framework, версия 1.1 в отношении интернирования пустой строки. В следующем примере переменной str1 присваивается ссылка на значение поля Empty, переменной str2 присваивается ссылка на значение поля Empty, возвращенное методом Intern после преобразования объекта StringBuilder со значением Empty в строку. Затем ссылки в str1 и str2 сравниваются, чтобы определить их равенство.
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
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.");
В .NET Framework 1.0, .NET Framework 1.1 и .NET Framework 3.5 с пакетом обновления 1 (SP1) str1 и str2 не равны. В .NET Framework версия 2.0, с пакетом обновления 1 и .NET Framework, версия 3.0 str1 str2 равны.
Вопросы производительности
Если вы стремитесь сократить общий объем выделяемой приложением памяти, помните, что интернирование строки имеет два нежелательных побочных эффекта. Во первых, выделяемая для интернированных объектов String память едва ли освободится до завершения работы среды CLR. Дело в том, что ссылка на интернированный объект String, которую хранит CLR, может сохраняться и после завершения работы приложения и даже домена приложения. Во-вторых, для интернирования строки ее сначала нужно создать. Используемая объектом String память должна быть вначале выделена, не смотря на то, что она подлежит освобождению сборщиком мусора.
Платформа .NET Framework версии 2.0 вводит член перечисления CompilationRelaxations..::.NoStringInterning. Член перечисления NoStringInterning помечает сборку как не требующую интернирования строковых литералов. NoStringInterning можно применить к сборке с помощью атрибута CompilationRelaxationsAttribute. Также, если для компиляции сборки до времени выполнения используется Генератор образов в машинном коде (Ngen.exe), строки не интернируются в модулях.
В следующем примере кода используются три строки с равными значениями для определения того, равны ли вновь созданная и интернированная строки.
' Sample for String.Intern(String)
Imports System
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 = '{0}'", s1)
Console.WriteLine("s2 = '{0}'", s2)
Console.WriteLine("s3 = '{0}'", s3)
Console.WriteLine("Is s2 the same reference as s1?: {0}", s2 Is s1)
Console.WriteLine("Is s3 the same reference as s1?: {0}", s3 Is s1)
End Sub 'Main
End Class 'Sample
'
'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 == '{0}'", s1);
Console.WriteLine("s2 == '{0}'", s2);
Console.WriteLine("s3 == '{0}'", s3);
Console.WriteLine("Is s2 the same reference as s1?: {0}", (Object)s2==(Object)s1);
Console.WriteLine("Is s3 the same reference as s1?: {0}", (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
*/
// 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)
import System.*;
import System.Text.*;
class Sample
{
public static void main(String[] args)
{
String s1 = "MyTest";
String s2 = (new 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}",
System.Convert.ToString((Object)s2 == (Object)s1));
Console.WriteLine("Is s3 the same reference as s1?: {0}",
System.Convert.ToString((Object)s3 == (Object)s1));
} //main
} //Sample
/*
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
*/
Windows Vista, Windows XP с пакетом обновления 2 (SP2), Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 с пакетом обновления 4 (SP4), Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile для карманных ПК, Xbox 360
Среды .NET Framework и .NET Compact Framework поддерживают не все версии каждой платформы. Поддерживаемые версии перечислены в разделе Требования к системе для .NET Framework.
.NET Framework
Поддерживается в версиях: 3.5, 3.0, 2.0, 1.1, 1.0
.NET Compact Framework
Поддерживается в версиях: 3.5, 2.0, 1.0
XNA Framework
Поддерживается в версиях: 2.0, 1.0
Ссылки
Дата
|
Журнал
|
Причина
|
|---|
Июль 2008
|
В разделе "Описание версии" добавлено обсуждение поведения метода в .NET Framework 3.5 с пакетом обновления 1 (SP1).
|
Исправление ошибки содержимого.
|