나는 책 Troelsen과 Schildt에서 이것에 관해 읽었습니다. 그리고 지금 나는 혼란스러워합니다.이 질문에 대한 그들의 의견은 다릅니다 .Schildt는 ref를 통해 정수형을 전달할 때 함수가 변수가 힙에있는 곳을 보여줍니다. 트로 셀렌은 함수가 oriignal copy를 얻는다는 것을 설명합니다 ... 그리고 가능한 경우 refrefce 유형이 ref를 통과했을 때 대문자를 듣기를 원합니다 ...ref 수정자가 value 및 refernce 유형에 대해 어떻게 작동합니까? 누군가 철저하게 설명 할 수 있습니까?
답변
변수를 ref
을 사용하는 메소드의 인수로 사용하면 인수를 전달하는 것이 아니라 변수 자체에 메소드 제어를 부여하는 것입니다. (만 ref
하지 속성을 사용하여 변수를 전달할 수 있습니다 이유입니다.)
내가 변수
var x = 1;
이 내가 그런ref
void DoSomethingWith(int arg)
{
arg++;
}
DoSomethingWith(x);
없이하는 방법 에 전달하는 경우 그 방법은 DoSomethingWith
은 arg
으로 원하는 것을 할 수 있습니다. 그러나 호출하는 방법에 대해 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
같은과 "액세스 식을 배열 요소"에. 던져됩니다 같은 용어에 대한 정보를 찾는 경우가 도움이 생각하지 않습니다 과학, 그것은 새로운 개념을 파악하려고하는 누군가에게 조금 더 부담을 더한다.
감사합니다. – NeoXX
- 1. 누군가 reddit의 created_utc에 대해 설명 할 수 있습니까? 을 보면
- 2. 누군가 Entity SQL의 REF, CREATEREF, DEREF, KEY에 대해 설명 할 수 있습니까?
- 3. 누군가 콜백 기능을 설명 할 수 있습니까?
- 4. 누군가 WebKit을 설명 할 수 있습니까?
- 5. 누군가 나를 회전하는 캘리퍼스에 대해 설명 할 수 있습니까?
- 6. 누군가 동적 PHP 페이지 캐싱에 대해 설명 할 수 있습니까?
- 7. 누군가 다형성을 설명 할 수 있습니까?
- 8. 누군가 나에게이 작품을 설명 할 수 있습니까?
- 9. 누군가 iFrames를 설명 할 수 있습니까?
- 10. 누군가 트리 탐색이 어떻게 작동하는지 직관적으로 설명 할 수 있습니까?
- 11. 누군가 Microsoft Unity를 설명 할 수 있습니까?
- 12. 누군가 descendantFocusability = afterDescendants를 설명 할 수 있습니까?
- 13. 누군가 com.google.inject의 기능을 설명 할 수 있습니까?
- 14. 누군가 UIAlertView의 차이점을 설명 할 수 있습니까?
- 15. 누군가 Gtk2 포장을 설명 할 수 있습니까?
- 16. 누군가 ja_JP.UTF8을 설명 할 수 있습니까?
- 17. 누군가 WindowAdapter 추상 클래스가 어떻게 작동하는지 설명 할 수 있습니까?
- 18. 누군가 어떻게 'sigaction'이 작동하는지 설명 할 수 있습니까?
- 19. 누군가 struts2 XSL ResultType이 어떻게 작동하는지 설명 할 수 있습니까?
- 20. 누군가 "conj"의 동작을 설명 할 수 있습니까?
- 21. 누군가 Java의 제네릭에서이 기본 유형의 사용을 설명 할 수 있습니까?
- 22. 누군가 Spring web.xml 파일을 설명 할 수 있습니까?
- 23. 특정 유형에 대해 TypeConverter를 어떻게 추가 할 수 있습니까?
- 24. paxos - 누군가 설명 할 수 있습니다. 예 :
- 25. yacc은 어떻게 작동합니까? 섹션별로 섹션을 설명 할 수 있습니까?
- 26. 누군가 OrgDBOrgSettings 유틸리티의 구성 설정을 설명 할 수 있습니까?
- 27. 누군가 Google Image Swirl에서 보이는 효과를 설명 할 수 있습니까?
- 28. 누군가 나에게 간단한 파이썬 개념을 설명 할 수 있습니까?
- 29. 누군가 redis setbit 명령을 설명 할 수 있습니까?
- 30. 누군가 중력의 가치를 실험하는 방법을 설명 할 수 있습니까?
http://pobox.com/~skeet/csharp/parameters.html을 참조하십시오. 내 추측으로는 Troelsen을 잘못 읽은 것입니다. –
고맙습니다. Mr Skeet – NeoXX
@ JonSkeet의 기사는 더 이상 알 필요가 없습니다. – Andrew