2016-07-21 4 views
4
string first="Example"; 
string second="Example"; 

두 문자열의 해시 코드가 같고 두 참조가 모두 동일합니다.동일한 값을 가진 두 개의 문자열이 어떻게 메모리에 저장됩니까?

내 질문 :이 문자열 변수가 메모리 위치에 데이터의 단일 사본을 가지고 있습니까?

string third="Example"; 
static string fourth="Example"; 
const string fifth="Example"; 

위의 두 세트간에 차이가 있습니까? 이 구체 예에서

+1

리터럴 문자열이 [문자열 풀]에 추가 되었기 때문에이 경우 모든 변수가 동일한 문자열 개체를 참조합니다 (https://msdn.microsoft.com/en-us/library/system.string.intern (v = vs .110) .aspx) –

+1

Tim 외에도 새 문자열 ("Example")을 사용할 때 새 인스턴스에 대한 새 참조를 만듭니다. – HimBromBeere

답변

4

모든 문자열은 다른 참조 동일한 값으로 단일 string 개체이다. 이는 ldstr IL 명령어가 리터럴 문자열을 인턴하고 ldstr을 할당하는 대신이를 다시 사용하기 때문입니다.

당신은 다음 호 사이트에서 문자 ldstr로 전환되고, 인턴을 따라 달라질 수 있습니다 공유하는 방식 때문에 const 하나가 약간 더 intersting 것을 ReferenceEquals(first, second)

참고로이 문제를 확인하실 수 있습니다 어셈블리 경계에.

그러나 사실 : 모두"Example"은 동일한 참조 여야합니다. 입력 데이터 처리에서 문자열을 얻는 대부분의 다른 메커니즘은 이 아니며은 내부 데이터를 보지만 새로운 문자열을 생성합니다.

+0

지적 해 주셔서 감사합니다! 나는이 주제에 대해 읽어보아야 할 것이다 ^^ –

+0

UR 대답에 대해 고마워하지만 나는 한 가지 더 물어볼 질문이있다. 'code StringBuilder test = new StringBuilder ("abcde"); 문자열 test2 = "abcde"; string test3 = String.Intern (test.ToString()); ' 위 스 니펫에 각각 별도의 참조가 있습니다. 그들 사이의 차이점은 무엇입니까? –

+0

@ testkotLokeswar 실제로'test2'와'test3'는 같은 참조입니다 -'test.ToString()'이 반환하는 중간 문자열 별개입니다. 이것이'string.Intern'을 거칠 때'test2'가'ldstr'를 통해 얻은 것과 동일한 인턴 버전을 얻게됩니다. 'test'는 처음에는'string'이 아니기 때문에 같은 참조가 될 수 없습니다. –

관련 문제