System.String.Intern 메서드

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

공용 언어 런타임은 프로그램에서 프로그래밍 방식으로 선언되거나 생성된 고유한 리터럴 문자열 각각에 대한 단일 참조가 포함된 인턴 풀이라하고 하는 테이블을 유지 관리하여 문자열 스토리지를 절약합니다. 따라서 특정 값을 가진 리터럴 문자열의 인스턴스는 시스템에 한 번만 존재합니다.

예를 들어 여러 변수에 동일한 리터럴 문자열을 할당하는 경우 런타임은 인턴 풀에서 리터럴 문자열에 대한 동일한 참조를 검색하여 각 변수에 할당합니다.

이 메서드는 Intern 인턴 풀을 사용하여 값 str과 같은 문자열을 검색합니다. 이러한 문자열이 있으면 인턴 풀에서 해당 참조가 반환됩니다. 문자열이 없으면 참조 str 가 인턴 풀에 추가된 다음 해당 참조가 반환됩니다.

다음 예제에서는 "MyTest" 값이 있는 문자열 s1이 프로그램의 리터럴이므로 이미 인턴으로 구성됩니다. 클래스는 System.Text.StringBuilder s1과 동일한 값을 가진 새 문자열 개체를 생성합니다. 해당 문자열에 대한 참조는 s2에 할당됩니다. 메서드는 Intern s2와 동일한 값을 가진 문자열을 검색합니다. 이러한 문자열이 존재하기 때문에 메서드는 s1에 할당된 것과 동일한 참조를 반환합니다. 그런 다음 해당 참조가 s3에 할당됩니다. 참조 s1과 s2는 서로 다른 개체를 참조하기 때문에 같지 않습니다. 는 동일한 문자열을 참조하기 때문에 s1과 s3이 같음 비교를 참조합니다.

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.

이 메서드를 메서드와 비교합니다 IsInterned .

다음 예제에서는 변수 str1 에 대한 참조String.Empty가 할당되고 값이 문자열인 개체를 String.Empty 변환한 후 메서드를 호출 Intern 하여 StringBuilder 반환되는 참조가 변수 str2 에 할당됩니다String.Empty. 그런 다음, 참조가 포함 str1 되고 str2 같음으로 비교됩니다. str1str2가 같은 경우

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.");
let str1 = String.Empty
let str2 = String.Empty

let sb = StringBuilder().Append String.Empty
let str3 = String.Intern(string sb)

if (str1 :> obj) = (str3 :> obj) then
    printfn "The strings are equal."
else
    printfn "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

성능 고려 사항

총 메모리 양을 줄이기 위해 시도 하는 경우 애플리케이션 할당, 문자열 인터닝 두 원치 않는 부작용을 염두에 둡니다. 첫째, 인턴 String 된 개체에 할당된 메모리는 CLR(공용 언어 런타임)이 종료될 때까지 해제될 가능성이 없습니다. 이유는 풀에 대 한 참조를 CLR의 String 개체 후 애플리케이션 또는 애플리케이션 도메인도 유지할 수 있습니다, 종료 합니다. 둘째, 문자열을 인턴하려면 먼저 문자열을 만들어야 합니다. 메모리가 String 결국 가비지 수집되더라도 개체에서 사용하는 메모리는 여전히 할당되어야 합니다.

열거형 멤버는 CompilationRelaxations.NoStringInterning 문자열 리터럴 인턴링을 요구하지 않는 어셈블리를 표시합니다. 특성을 사용하여 어셈블리에 적용 NoStringInterningCompilationRelaxationsAttribute 수 있습니다. 또한 Ngen.exe(네이티브 이미지 생성기)를 사용하여 런타임 전에 어셈블리를 컴파일하는 경우 문자열은 모듈 간에 인턴되지 않습니다.