2016-06-24 1 views
-2

나는 책 Troelsen과 Schildt에서 이것에 관해 읽었습니다. 그리고 지금 나는 혼란스러워합니다.이 질문에 대한 그들의 의견은 다릅니다 .Schildt는 ref를 통해 정수형을 전달할 때 함수가 변수가 힙에있는 곳을 보여줍니다. 트로 셀렌은 함수가 oriignal copy를 얻는다는 것을 설명합니다 ... 그리고 가능한 경우 refrefce 유형이 ref를 통과했을 때 대문자를 듣기를 원합니다 ...ref 수정자가 value 및 refernce 유형에 대해 어떻게 작동합니까? 누군가 철저하게 설명 할 수 있습니까?

+2

http://pobox.com/~skeet/csharp/parameters.html을 참조하십시오. 내 추측으로는 Troelsen을 잘못 읽은 것입니다. –

+0

고맙습니다. Mr Skeet – NeoXX

+0

@ JonSkeet의 기사는 더 이상 알 필요가 없습니다. – Andrew

답변

3

변수를 ref을 사용하는 메소드의 인수로 사용하면 인수를 전달하는 것이 아니라 변수 자체에 메소드 제어를 부여하는 것입니다. (만 ref하지 속성을 사용하여 변수를 전달할 수 있습니다 이유입니다.)

내가 변수

var x = 1; 

이 내가 그런ref

void DoSomethingWith(int arg) 
{ 
    arg++; 
} 

DoSomethingWith(x); 

없이하는 방법 에 전달하는 경우 그 방법은 DoSomethingWitharg으로 원하는 것을 할 수 있습니다. 그러나 호출하는 방법에 대해 x는 여전히 1

동일합니다하지만 통과하면 그것은 그 때 나는 내 변수, x을 통해 그 방법 제어를주는거야 ref

void DoSomethingWith(ref int arg) 
{ 
    arg++; 
} 

DoSomethingWith(ref x); 

를 사용하여. arg에 1을 더하면 x에 1을 더합니다.

ref을 사용하든 사용하지 않든간에 메서드는 객체의 상태를 수정할 수 있기 때문에 참조 유형과 조금 더 혼동 스럽습니다. 예를 들어 List<object>을 메서드에 전달하면 해당 메서드는 ref을 사용했는지 여부에 관계없이 목록에 항목을 추가하거나 제거 할 수 있습니다.

다시 말해서 ref을 사용하면 변수를 제어 할 수 있습니다. 다른 List<object>을 만들어 변수에 할당 할 수 있습니다. 변수를 null으로 설정할 수 있습니다. ref을 사용하지 않으면 그렇게 할 수 없습니다. ref없이 - -이 메소드를 호출하면

! "안녕하세요"와

void DoSomethingWithList(List<string> list) 
{ 
    list.Add("Hello!"); 
    list = new List<string>(); 
    list.Add("Goodbye!"); 
} 

이 부가됩니다 문자열 목록을 전달 내가 전달한 목록에. 그러나 때 메서드에 전달 된 변수에 영향을주지 않습니다 새 List<string> 만듭니다. 이 변수는 여전히 동일한 목록을 참조하며 문자열 "Hello!"와 함께 표시됩니다. 그것에 추가되었습니다. 그 다음

void DoSomethingWithList(ref List<string> list) 
{ 
    list.Add("Hello!"); 
    list = new List<string>(); 
    list.Add("Goodbye!"); 
} 

ref를 사용하는 경우

그러나 무엇이든 내가 전달 변수 새 목록으로 대체됩니다. 메소드 실행이 끝나면 내 변수에는 "Goodbye!"라는 단어가 새롭게 포함 된 List<string>이 포함됩니다.

여기에 더 많은 예제가 포함 된 blog post이 있습니다.

documentation (ref)에 대해 설명합니다.그러나 많은 문서와 마찬가지로 읽기 쉽고 이해하기 쉬운 것보다 정확하다는 것이 더 중요합니다. 일단 당신이 그것을 이해했다면 이것은 완벽하게 이해가됩니다. 그러나 당신이 이미 그것을 모르는 경우 이해가 어렵다는 것을 알 수 있습니다.

참조로 전달하는 효과는 호출 된 메서드에서 매개 변수의 변경 내용이 호출 메서드에 반영된다는 것입니다. 예를 들어, 호출자가 로컬 변수 식 또는 배열 요소 액세스 발현을 통과하면, 피 호출 방법은 REF 파라미터 참조 처 하는 객체를 대체하고 발신자의 로컬 변수 나 배열 요소는 이제 새로운 참조 목적.

는 아마 나를 그냥하지만 ​​로켓하지 비록 난 그냥 누군가가 ref 같은과 "액세스 식을 배열 요소"에. 던져됩니다 같은 용어에 대한 정보를 찾는 경우가 도움이 생각하지 않습니다 과학, 그것은 새로운 개념을 파악하려고하는 누군가에게 조금 더 부담을 더한다.

+0

감사합니다. – NeoXX

관련 문제