2017-09-28 2 views
0

참조 유형과 값 유형의 차이를 이해할 수 있다고 생각했습니다. 'string'은 참조 유형의 동작을 유지하면서 값 유형 의 의미가 인 것으로 생각했습니다. 그런 다음 두 가지 경우 모두 True를 반환 할 것을 기대하면서이 작업을 시도했습니다. 내가 잘못 이해 한 것은 무엇입니까?string이 참조 유형 인 경우 strA의 값이이 경우 변경되지 않는 이유는 무엇입니까?

 string strA = "AAA"; 
     string strB = strA; 
     strB = "BBB"; 
     Console.WriteLine($"strA is {strA} and strB is {strB}"); 
     Console.WriteLine($"The statement: strA == strA is {strA == strB} \n"); 

     Car car1 = new Car(); 
     car1.Horsepower = 190; 
     Car car2 = car1; 
     car2.Horsepower = 200; 
     Console.WriteLine($"car1.Horsepower is {car1.Horsepower} and car2.Horsepower is {car2.Horsepower}"); 
     Console.WriteLine($"The statement: car1 == car2 is {car1 == car2}"); 

출력 :

STRA이 AAA이고 STRB는 BBB

문입니다 : STRA가 STRA가

car1.Horsepower가 200 False입니다 ==와 car2.Horsepower가 200

진술 : car1 == car2는 True입니다.

+0

일단 문자열 값이 설정되면 메모리의 해당 위치를 가리 킵니다. 결코 바뀔 수 없다. 새 값을 설정하면 실제로 새 값을 보유하는 메모리의 다른 위치에 새 포인터가 생깁니다. 이 동작을 원하면 문자열 작성기로 시도하십시오. StringBuilder builderA = 새 StringBuilder ("AAA"); StringBuilder builderB = builderA; builderB.Replace ("AAA", "BBB"); Console.WriteLine ($ "builderA는 {builderA.ToString()}이고 builderB는 {builderB.ToString()}")입니다. – Aaron

+0

@Aaron : Ah. C#에서 해당 문자열을 변경할 수 있습니다. 나는 값을 바꿀 때 포인터가 바뀐다는 생각에 반대하지 않았다. StringBuilder에 대한 통찰력을 가져 주셔서 감사합니다. 내가 할 수만 있다면이 의견을 대답으로 표시 할 것입니다. – PakiPat

+0

다른 '순수한'참조 유형에 공통적 인 문자열의 유일한 측면은 스택이 아닌 힙에 저장된다는 것입니다. – PakiPat

답변

2

문자열 리터럴은 문자열 인스턴스를 지정합니다. 촉진하기 위해 자동차에 문자열을 변환, 이것은 당신이 문자열 무슨 일을하는지 기본적으로 :

Car AAA = new Car(); 
Car BBB = new Car(); 

Car carA = AAA; 
Car carB = carA; 
carB = BBB; 
Console.WriteLine($"carA is {carA} and carB is {carB}"); 
Console.WriteLine($"The statement: carA == carB is {carA == carB} 

큰 차이가 컴파일러 정적 문자열 객체를 미리가-할당하기 때문에 당신이 "string literals" 대신 new Car/new String의 사용이다.

관련 문제