2014-04-07 2 views
1

그래서 C#으로 전달되는 매개 변수에 관한 Jon Skeet의 기사를 읽었으며 참조 형식이 작동하는 방식을 설명하기 위해 다음 예제를 만들었지 만 주위에 머리를 감쌀 수 없습니다.참조 형식에 대한 설명이 필요합니다

StringBuilder first = new StringBuilder(); 
first.Append("hello"); 
StringBuilder second = first; 
first.Append(" world"); 
first = new StringBuilder("goodbye"); 
Console.WriteLine(first); // Prints goodbye 
Console.WriteLine(second); // Still prints hello world 

우리는 우리가 단지 StringBuilder 객체의 참조에 그 값을 설정하는 second 변수의 값을 할당하는거야?

또한 보너스 질문으로 second 변수의 참조를 다른 것으로 변경하면 (예 : null 값으로 설정), StringBuilder 개체에 대한 참조를 복구 할 수 없습니까? 아니면 특정 유형의 모든 생성 된 객체를 검색 할 수있는 방법이 있습니까?

+0

보너스 질문이 명확하지 않습니다. 다음과 같이하면된다 :'StringBuilder second = first; 두 번째 = null; '예를 들어? –

+0

바로 그 뜻입니다. 명확하게 편집하겠습니다. –

답변

3

이있다?

예. 우리는 단지 "안녕하세요 세계"를 포함하는 메모리에 포인터를 복사합니다. 우리는 뭔가 다른 에 두 번째 변수의 참조를 변경한다면

, 것 처음의 StringBuilder 개체에 대한 참조는 회복 할 수없는 일? 또는 어떤 유형의 의 생성 된 모든 객체를 검색 할 수있는 방법이 있습니까?

예, 그것에 의해 할당 된 메모리는 참조하는 포인터가 없으므로 가비지 수집 대상이됩니다.

+0

그래서 당신이 정확하게 이해한다면, GC는 더 이상 포인터가 없어지면 즉시 처분 할 것입니다. 이것은 다소 일시적일까요? –

+1

@OverlyExcessive - 아니요. 즉각적이지 않습니다. "추후에"언젠가는 메모리 압력이 높아 지거나 (시스템에 여분의 메모리가 필요함) 또는 정리할 여유가 생길 수 있습니다. –

+0

@OverlyExcessive : 2 세대로 끝나면 메모리 누수가 발생할 수 있습니다.[가비지 수집의 기초] (http://msdn.microsoft.com/en-us/library/vstudio/ee787088%28v=vs.100%29.aspx#generation) – Tigran

0

라인

first = new StringBuilder("goodbye"); 

휴식이 두 객체 사이의 연결.

그래서 일단 goodbye을 가지고 있으며, 우리는 우리가 모두 StringBuilder 개체의 참조에 그 값을 설정하는 두 번째 변수의 값을 할당 할 때 두 번째 hello world

1
StringBuilder second = first; 

second 변수는 이제 first 변수와 같은 메모리 장소에 대한 참조를 보유하고 있다는 것을 의미한다.

그러나,이 라인 :

first = new StringBuilder("goodbye"); 

지금 first 따라서 firstsecond 사이의 연결을 깨는, 새로운 객체에 대한 새로운 참조를 가져옵니다 말한다.

관련 문제