다음을 통해 공유


System.String.Intern 메서드

비고

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

공용 언어 런타임은 각 고유 문자열 값에 대한 단일 참조를 보유하는 인턴 풀이라는 테이블을 유지 관리합니다. 이 메서드는 Intern 인턴 풀을 사용하여 값 str과 같은 문자열을 검색합니다. 이러한 문자열이 없으면 참조 str 가 풀에 추가되고 해당 참조가 반환됩니다. 반면 요청된 문자열이 IsInterned(String) 인턴 풀에 없는 경우 메서드는 null 참조를 반환합니다.

인턴 풀은 런타임에서 문자열 스토리지를 절약하는 데 사용할 수 있습니다. 그러나 문자열 리터럴의 자동 인턴팅은 보장되지 않습니다. 어셈블리가 컴파일되고 실행되는 방법에 따라 일부 리터럴이 풀에 추가되지 않을 수 있습니다.

다음 예제에서 문자열 s1 의 값은 "MyTest"입니다. 클래스는 System.Text.StringBuilder 값이 같은 s1새 문자열 개체를 생성합니다. 해당 문자열에 대한 참조가 .에 s2할당됩니다. 메서드는 Interns2이 같은 문자열을 검색합니다. 이미 인턴된 경우(예: 어셈블리에 문자열 리터럴 인턴링이 필요하기 때문에) 메서드는 s1과 동일한 참조를 반환하며, 이 참조는 s3에 할당됩니다. 그리고 s1s3는 같음으로 비교됩니다. 그렇지 않으면 s2에 대한 새로운 인턴된 항목이 만들어지고 s3에 할당되며, s1s3는 같지 않음을 비교합니다. s1s2는 두 경우 모두 서로 다른 개체를 참조하므로 같지 않다고 비교합니다.

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 문자열 리터럴 인턴링을 요구하지 않는 어셈블리를 표시합니다. 기본적으로 C# 컴파일러는 성능 향상을 위해 각 어셈블리마다 CompilationRelaxationsAttributeNoStringInterning 플래그와 함께 생성합니다. 이는 문자열 리터럴이 인턴 풀에 추가될 것을 보장하지 않음을 의미합니다. NoStringInterningCompilationRelaxationsAttribute 특성을 사용하여 어셈블리를 사용자 지정할 수 있습니다.

네이티브 AOT를 사용하여 앱을 게시하는 경우 해제 NoStringInterning 는 지원되지 않습니다. 네이티브 AOT에서는 문자열 리터럴이 인턴 풀에 추가되도록 보장되지 않으므로 Intern 소스 코드에서 리터럴로 보이는 문자열에 대한 일치 항목을 찾을 수 없습니다.