2009-09-04 16 views
3

MSDN은String.Intern과 String.IsInterned의 차이점은 무엇입니까?

String.Intern이

String.IsInterned 지정된 문자열에 참조를 검색하는 지정된 String에 대한 시스템의 참조를 검색하는 상태.

나는 IsInterned가 지정된 문자열이 인계되었는지 여부를 나타내는 bool을 리턴해야한다고 생각합니다. 그 생각이 맞습니까? 나는 그것이 적어도 .net 프레임 워크 명명 규칙과 일치하지 않는다는 것을 의미한다.

string s = "PK"; 
    string k = "PK"; 

    Console.WriteLine("s has hashcode " + s.GetHashCode()); 
    Console.WriteLine("k has hashcode " + k.GetHashCode()); 
    Console.WriteLine("PK Interned " + string.Intern("PK")); 
    Console.WriteLine("PK IsInterned " + string.IsInterned("PK")); 

출력은 :

는 다음 코드 작성

들 해시를 갖고 -837830672

k는 해시를 -837830672

PK 구금을 갖는다 PK

PK IsInterned PK "PK"를 반환 왜 ("PK") string.IsInterned되어

?

+1

이 질문에 http://stackoverflow.com/questions/372547/where-do-java-and-net-string-literals-reside/372559#372559 –

+2

이름은 매우 비싸다. 아마도 그것은 "IfInterned"의 오타 였을 것입니다. – Greg

+0

'GetHashCode'를 사용함에 주목하십시오 :'System.String' 클래스 *가 * GetHashCode()를 오버라이드합니다. 따라서 이러한 메소드 호출은 인스턴스가 다를 수 있는지 여부를 확인하는 데 유용하지 않습니다. 대신'using System.Runtime.CompilerServices; 지시문을 포함하고'RuntimeHelpers.GetHashCode (string)'을 사용하십시오. 다음은 좋은 예입니다 :'string s = "PK"; 문자열 t = 'P'.ToString() + "K"; 콘솔.WriteLine ("s에는 재정의되지 않은 해시 코드가 있습니다"+ RuntimeHelpers.GetHashCode (s)); Console.WriteLine ("t에는 오버라이드되어 있지 않은 해시 코드가 있습니다."+ RuntimeHelpers.GetHashCode (t));'. –

답변

17

String.Intern interns 이미 문자열이 지정되지 않은 경우 문자열을 사용합니다. String.IsInterned하지 않습니다.

IsInterned("PK")은 이미 인턴되기 때문에 "PK"를 반환합니다. 문자열이 bool 대신에 반환되는 이유는 인턴 된 문자열 자체에 대한 참조를 쉽게 얻을 수 있기 때문입니다 (전달 된 것과 동일한 참조가 아닐 수도 있습니다). 즉, 효과적으로 한 번에 두 가지 정보 관련 조각을 반환 - 당신은 쉽게 bool 반환을 시뮬레이션 할 수 있습니다 :

public static bool IsInternedBool(string text) 
{ 
    return string.IsInterned(text) != null; 
} 

내가 이름이 적합하지 않습니다 동의, 내가했을 모르겠어요하지만, 더 나은 : GetInterned 아마도?

여기에 불구하고 그 차이를 보여주는 예입니다 - 내가 그들을 피하기 위해, 문자열 리터럴을 사용하지 않는 사전에 구금되고 : 당신은 문자열의 세부 사항에 대한 자세한 내용을 알고 싶어 내 대답을 참조하십시오 인턴 경우

using System; 

class Test 
{ 
    static void Main() 
    { 
     string first = new string(new[] {'x'}); 
     string second = new string(new[] {'y'}); 

     string.Intern(first); // Interns it 
     Console.WriteLine(string.IsInterned(first) != null); // Check 

     string.IsInterned(second); // Doesn't intern it 
     Console.WriteLine(string.IsInterned(second) != null); // Check 
    } 
} 
+0

@ 존 감사합니다. 문자열 s 선언에 "PK"가 포함되어 있어야한다고 생각하는 것이 맞습니까? String.Intern ("PK")는 무엇을 할 것인가? –

+4

모든 리터럴 문자열은 기본적으로 사용되지 않습니다. –

+1

@PK 문자열이 이미 인턴 된 경우 인턴은 전달 된 동일한 참조를 반환합니다. 리터럴이 자동으로 인턴된다는 사실을 알지 못했지만 완전히 의미가 있습니다. –

관련 문제