배열 또는 목록이 기본적으로 C #에서 참조로 전달됩니까?


84

그들은 할? 아니면 프로그램 속도를 높이려면 참조로 전달해야합니까?


35
프로그램 속도를 높이려면 (1) 의미있는 목표를 설정하고, (2) 목표를 달성했는지 테스트하고, (3) 목표를 달성하지 못한 경우 프로파일 링 도구를 사용하여 가장 느린 것을 찾고, (4 ) 가장 느린 것을 최적화하십시오.
Eric Lippert


3
@EricLippert 귀하의 의견은 게시 된 답변보다 OP의 실제 질문에 훨씬 더 잘 답변합니다. 모두가 "가치 기준 전달"기술에 너무 산만 해져 성능 최적화에 대한 실제 질문을 완전히 간과했습니다. 불행히도 OP는 그의 요구를 다소 잘 전달하지 못했고 다른 답변은 적어도 Google 군중을 도울 것입니다.
Dan Bechard 2015 년

"다른 답변은 적어도 Google 군중에게 도움이 될 것입니다."-그럴 것입니다! :)
miki

답변:


208

참조 전달되는 .

.NET의 배열은 힙의 객체이므로 참조가 있습니다. 해당 참조는 값으로 전달됩니다. 즉 , 배열 의 내용 에 대한 변경 사항 은 호출자가 볼 수 있지만 배열을 다시 할당 하면 다음과 같이 표시되지 않습니다.

void Foo(int[] data) {
    data[0] = 1; // caller sees this
}
void Bar(int[] data) {
    data = new int[20]; // but not this
}

ref수정자를 추가하면 참조참조 로 전달 되고 호출자는 위의 변경 사항을 볼 수 있습니다.


28
대답은 맞지만 "참조는 가치로 전달된다"고 말하는 사람들을 싫어합니다. 문제를 혼란스럽게합니다. 예, 참조 (메모리 주소)는 값으로 전달되지만 문제는 아닙니다.
WernerVA

9
@WernerVA 정확 하고 모호하지 않은
Marc Gravell

2
나는 표현하지 않을 것입니다. 아마도 조금 더 자세하게 표현할 것입니다.
WernerVA

이것은 질문의 속도 부분에 대한 답이 아닙니다. 참조 사본을 최적화하는 것은 훨씬 더 비싼 수백 가지 작업이 발생하는 것과 비교할 때 완전히 무시할 수 있다는 것이 분명하지만 OP는 이것을 구체적으로 묻습니다.
Dan Bechard

7
@Dan 속도 부분은 본질적으로 "배열이 값으로 전달되는 경우-배열 내용의 복사본을 의미합니다-이는 모든 메모리의 할당 및 복사본을 의미합니다"와 연결됩니다. 전달 된 참조 이므로 답변 할 성능 질문이 없습니다. 질문의 해당 부분은 모의로 렌더링되고 자동으로 답변됩니다. 지금은 코멘트에 명시 적으로 여기에 대한 답변을 제외하고 ...
마크 Gravell

9

값으로 전달되지만 (ref도 out도 아닌 모든 매개 변수와 마찬가지로) 값 객체에 대한 참조이므로 효과적으로 참조로 전달됩니다.


0

예, 기본적으로 C #에서 참조로 전달됩니다. C #의 모든 개체는 값 형식을 제외하고 있습니다. 좀 더 정확하게 말하면 "값별 참조"로 전달됩니다. 즉, 메서드에서 볼 수있는 변수의 값은 전달 된 원래 개체에 대한 참조입니다. 이것은 작은 의미 점이지만 때로는 중요 할 수 있습니다.


9
참조는 값으로 전달됩니다. "참조로 전달됨"과는 매우 다릅니다.
Marc Gravell

1
이것은 진실과 정반대입니다. John Skeet의이 게시물 인용 : "기본적으로 모든 매개 변수는 C #의 값으로 전달됩니다. 매개 변수는 out 또는 ref 수정자를 명시 적으로 포함하는 경우에만 참조로 전달됩니다. 그러나 매개 변수의 유형이 언제인지 알아야합니다. 참조 유형이므로 실제 개체가 아닌 참조를 전달합니다. " 값으로 전달되는 것은 참조 (메모리 주소)뿐입니다.
alexlomba87
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.