2012-06-26 2 views
2

가능한 중복 : 아래의 코드와
passing in object by ref심판에 의해 목록 <int> 전달

는, 출력은 다음과 같습니다

Without: 
With:1 

코드 :

static void Main(string[] args) 
    { 
     var listWithoutRef = new List<int>(); 
     WithoutRef(listWithoutRef); 
     Console.WriteLine("Without:" + string.Join(" ", listWithoutRef)); 

     var listWithRef = new List<int>(); 
     WithRef(ref listWithRef); 
     Console.WriteLine("With:" + string.Join(" ", listWithRef)); 
    } 

    static void WithoutRef(List<int> inList) 
    { 
     inList = new List<int>(new int[] { 1 }); 
    } 

    static void WithRef(ref List<int> inList) 
    { 
     inList = new List<int>(new int[] { 1 }); 
    } 

그냥 이것을 보면서 목록이 힙에 있다고 말했을 것이므로 어쨌든 ref로 전달되므로 동일한 값을 가져야합니다. 내가 ref 키워드를 오해하고 있습니까? 아니면 다른 것을 놓치고 있습니까?

+1

가능한 복제본 [ref by object] (http://stackoverflow.com/questions/729526/passing-in-object-by-ref) - Jon Skeet의 질문에 대한 답변은 귀하가 객체를 변경하지 않고 새로운 객체를 지정하십시오. 또한 http://stackoverflow.com/questions/635915/when-to-use-ref-and-when-it-is-not-necessary-in-c-sharp?rq=1 –

답변

6

오전 내가 심판 키워드를 오해? 아니면 다른 것을 놓치고 있습니까?

예. 메서드 자체에 메서드 자체를 전달하지 않고 참조를 참조로 참조로 전달합니다. 이렇게하면 메서드 내에서 참조 (해당 listWithRef 실제 참조하는)를 변경하고 반영 할 수 있습니다.

ref 키워드를 사용하지 않으면 메서드가 목록에 대한 참조를 변경할 수 없습니다. 실제 목록 저장 메커니즘은 어느 경우에도 변경되지 않습니다.

에만 목록을 사용하려는 경우에는 필요하지 않습니다. 예를 들어 List<int>.Add으로 전화하면 목록에 새 항목이 추가됩니다. 참조 자체를 변경하려면 참조 유형에만 Ref가 필요합니다.

+0

을 (를) 찾을 수 없습니다. 이 질문에 대한 기존 답변? –

+1

@BenVoigt 나는 또한 투표를 끝내기로 결정했으나 어쨌든 여전히 대답했다. –

3

예, 모든 List 개체는 힙에 저장됩니다. 그러나 ref 키워드가 없으면 inList 매개 변수를 다시 할당하여 호출자의 범위에 영향을 줄 수 없습니다. 새 List 개체를 만들면 해당 개체가 힙에 새 개체로 추가되지만 참조 키워드를 사용하지 않으면 원래 참조의 호출자 범위가 영향을받지 않습니다. 당신이 그것을 재정의하지 않고 기존 List 메소드를 호출하는 경우 WithoutRef에서

, 당신은이 수정되는 것을 볼 수 있습니다 :

inList.Clear(); 
inList.Add(1);