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.

예외

예제

다음 예제에서는 새로 만든된 문자열로 지 여부를 결정 하는 값과 동일한 3 개의 문자열 및 인턴 지정된 문자열을 동일 합니다.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
'

설명

공용 언어 런타임은 프로그램에서 프로그래밍 방식으로 선언되거나 생성된 고유한 리터럴 문자열 각각에 대한 단일 참조가 포함된 인턴 풀이라하고 하는 테이블을 유지 관리하여 문자열 스토리지를 절약합니다.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.

합니다 Intern 메서드 내부 풀을 사용 하 여 문자열의 값을 검색 하려면 str합니다.The 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.

다음 예제에서는 "MyTest"의 값에는 문자열 s1에 프로그램의 리터럴 이기 때문에 인턴 지정 이미 됩니다.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.NET Framework 3.5 Service Pack 1, Intern 메서드.NET Framework 1.0 및 1.1 빈 문자열 인터닝 관련 하 여 해당 동작으로 돌아갑니다.In the .NET Framework 3.5 서비스 팩 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. 다음 예에서 변수 str1 에 대 한 참조를 할당 됩니다 Empty, 및 변수 str2 에 대 한 참조를 할당 하는 Empty 호출 하 여 반환 되는 Intern 메서드는 변환한후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. 에 포함 된 참조 한 다음 str1str2 서로 같은지 비교 합니다.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 SP1str1str2 같은지 합니다.In 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.NET Framework 2.0 Service Pack 1 하 고 .NET Framework 3.0.NET Framework 3.0, str1str2 같지 않습니다.In the .NET Framework 2.0 서비스 팩 1.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.

적용 대상

추가 정보