2014-09-02 4 views
-1

문자열에 대한 참조 유형 또는 값 유형에 대해 혼란 스럽습니다. 유형 문자열의 두 변수가 있습니다. 첫 번째 변수에 값을 할당 한 다음 동일한 변수를 두 번째 변수에 할당했습니다. 두 번째 변수가 첫 번째 변수와 동일한 위치를 가리키고 있기 때문에 두 번째 변수가 변경됩니까? 여기문자열은 값 유형 또는 참조 유형입니까?

 string string1 = "abc"; 

     string string2 = string1; 

     string1 = "xyz"; 

문자열 1은 XYZ 값을 들고 1과 문자열이 ABC

여기
+1

클래스이므로 참조 유형입니다. 또한 불변입니다. –

+0

@ JeroenVannevel하지만 두 변수 모두 값 xyz을 보유하지 않는 이유는 무엇입니까? –

+0

그리고 그것은 불변이라고해도 상관 없습니다. 여기에 'string1'이라는 변수에 다른 참조를 넣는 것뿐입니다. 실제로 아무것도 수정하지 않았습니다. – Jon

답변

4

있다가 무슨 일이야이야 :

string string1 = "abc"; 

string1가 힙에 살고있는 문자열 "ABC"에 참조입니다 어딘가에.

string string2 = string1; 

string2

단지 string1으로 메모리 내의 동일한 장소를 가리키는 일어나는 또 다른 기준이다. 할당 연산자를 사용하면 해당 참조가 string2으로 복사됩니다. 이제 메모리의 같은 위치를 가리키는 두 개의 변수가 있습니다.

string1 = "xyz"; 

string1 지금 "XYZ"를 포함하는 새로 만든 문자열을 가리 킵니다. string2여전히은 "abc"를 가리키며 여전히 도달 가능이며 가비지 수집되지 않습니다.

어쨌든 예; 문자열은 참조 유형입니다.

+0

하지만이 경우 stringbuilder가 문자열과 어떻게 다릅니 까? 케이스? –

+1

'StringBuilder'는 다르게 빌드되어'string'과 다른 동작을하기 때문에. 'StringBuilder'는 다른 목적을 가지고 있습니다; 그것은 돌연변이 방법을 포함하고 있으며, 끊임없이 새로운 문자열을 만드는 비용을 들이지 않고도 문자열을 만들 수 있습니다. –

+1

'StringBuilder'는 일련의 묶음을 통해 문자열을 만드는 데 최적화되어 있습니다. 'System.String'으로 이것을했다면, 문자열은 불변이므로 메모리를 계속해서 다시 할당해야합니다. –

관련 문제