이 문서는 이 API에 대한 참조 설명서를 보충하는 추가 설명을 제공합니다.
공용 언어 런타임은 프로그램에서 프로그래밍 방식으로 선언되거나 생성된 각 고유 리터럴 문자열에 대한 단일 참조를 포함하는 인턴 풀이라는 테이블을 유지 관리하여 문자열 스토리지를 절약합니다. 따라서 특정 값을 가진 리터럴 문자열의 인스턴스는 시스템에 한 번만 존재합니다. 예를 들어 여러 변수에 동일한 리터럴 문자열을 할당하는 경우 런타임은 인턴 풀에서 리터럴 문자열에 대한 동일한 참조를 검색하여 각 변수에 할당합니다.
이 메서드는 Intern 인턴 풀을 사용하여 해당 매개 변수 str
값과 동일한 문자열을 검색합니다. 이러한 문자열이 있으면 인턴 풀에서 해당 참조가 반환됩니다. 문자열이 없으면 str
에 대한 참조가 인턴링 풀에 추가된 다음, 해당 참조가 반환됩니다. 반면 요청된 문자열이 IsInterned(String) 인턴 풀에 없는 경우 메서드는 null 참조를 반환합니다.
다음 예제에서는 s1
문자열 "MyTest"가 프로그램의 리터럴이기 때문에 이미 내부화되었습니다. 클래스는 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.
성능 고려 사항
애플리케이션에서 할당하는 총 메모리 양을 줄이려는 경우 문자열 인턴팅에는 두 가지 원치 않는 부작용이 있음을 명심하세요. 첫째, 인턴 String 된 개체에 할당된 메모리는 CLR(공용 언어 런타임)이 종료될 때까지 해제될 가능성이 없습니다. 그 이유는 애플리케이션 또는 애플리케이션 도메인이 종료된 후에도 CLR이 인턴 String 된 개체에 대한 참조를 유지할 수 있기 때문입니다. 둘째, 문자열을 인터닝하려면 먼저 문자열을 만들어야 합니다. String 개체에서 사용하는 메모리는 결국 가비지 수집될 것이지만, 여전히 할당되어야 합니다.
열거형 멤버는 CompilationRelaxations.NoStringInterning 문자열 리터럴 인턴링을 요구하지 않는 어셈블리를 표시합니다. 어트리뷰트를 사용하여 NoStringInterning을(를) 어셈블리에 적용할 수 있습니다. 또한 Ngen.exe(네이티브 이미지 생성기) 를 사용하여 런타임 전에 어셈블리를 컴파일하는 경우 문자열은 모듈 간에 인턴되지 않습니다.
.NET