왜 C #에 out과 ref가 있습니까?


18

C #에는 outref키워드가 있습니다. 이 두 가지가 왜 필요한가요? 면책 조항 : C #에 대한 깊은 지식이 없습니다.


3
스택 오버플로에 사이트 간 중복이 없습니까?
Peter Mortensen


2
당신은 사이의 차이를 묻는 refout? 또는 참조 기준 인수의 사용법 ref/ out값 기준 인수 와 비교하여 (파라미터의 수정 자 없음) 묻고 있습니까? 아니면 둘다?
Jeppe Stig Nielsen

1
나는이 질문이 비슷하다고 생각하지만 적어도 언어 디자인 관점에서
본다면

답변:


32

구현 측면에서, 그것들은 본질적으로 같은 것이지만, 그렇지 않은 out것을 전달합니다 ref: 당신은 입력에 신경 쓰지 않습니다. 이것은 당신과 툴링에 특정한 것들을 의미합니다. 예를 들어, 초기화되지 않은 변수를 out매개 변수에 전달하면 문제가되지 않습니다. 그렇지 않으면 문제가 아니며 함수 내에서 out반환하기 전에 매개 변수에 값을 할당해야 하지만 아무것도 할 필요가 없습니다. 모두 ref가치가 있습니다.


10
컴파일러보다 Ref vs out이 프로그래머보다 훨씬 중요합니다. 컴파일러입니다 의무 가 값이 할당되기 전에 변수를 읽지 않는 특정 만들기 위해, 그리고 out그것을 당신이 첫번째 장소에있는 변수를 처리하는 방법을 개선하는 일치하도록 할 수있는 방법을 제공합니다.
Cort Ammon-복원 모니카

'out'은 'ref'가하지 않는 것을 전달합니다.
Neo

4
@ Neo : 기본적으로 대답에서 말한 것 : 입력에 이것을 사용하는 것에 대해 신경 쓰지 않는다는 것을 전달하므로 초기화되지 않은 값을 out매개 변수 에 전달하는 것이 안전 합니다. .
메이슨 휠러

@MasonWheeler 그래도 검증 자에 의해 허용 (및 / 또는 수신 측에서 시행)됩니까? Out은 내부적으로 속성 일뿐입니다.
Random832

@ Random832 : 로버트은이 문제를 논의, 그의 대답에서 에릭 Lippert의 (전 C # 컴파일러 사람)를 살펴 한 게시 stackoverflow.com/q/2876315
메이슨 윌러을

7

이 두 키워드를 이해하려면 참조로 값을 전달하는 것이 무엇인지 이해해야 합니다. 본질적으로 이는 메소드 또는 함수 내에서 전달하는 매개 변수를 수정하면 함수가 종료 될 때 해당 변수 가 수정 된 값을 유지함을 의미합니다 . 매개 변수를 선언 ref하거나 out이를 수행하면 일반 매개 변수는 함수에서 수정하더라도 원래 값을 유지합니다.

유일한 차이점 refoutout당신이 함수로 전달하기 전에 변수를 초기화 할 필요가 없습니다, 그러나 ref않습니다; 동안 out 수행 함수 내 변수에 뭔가를 할당 할 필요하지만, ref하지 않습니다.


분산과 관련된 차이가 없습니까?
monocell


2

당신은 물었다.

C #에는이 두 가지가 필요한 이유가 있습니다. C #에 대한 깊이있는 지식이 없습니다. out 및 ref 매개 변수가 필요한 이유는 무엇입니까?

그리고 대답은 그것들이 필요하지 않다는 것입니다. 예를 들어, java에는 하나도없고 VB에는 ref 만 있습니다 (그리고 메소드 선언에서만 필요합니다).

어느 쪽도 사용하지 않고 전체 프로그램을 쉽게 작성할 수 있습니다.

그것들은 때때로 유용하기 때문에 존재합니다. 그렇기 때문에 둘 중 하나만있는 것이 아닙니다. '여기있는 것이 있으면 원하는대로 수정하십시오'와 '이것에 새로운 가치를 부여하십시오'를 구분하는 것이 유용하기 때문입니다.

다른 언어는 다른 우선 순위를 가지므로 이들을 포함하거나 포함하지 않을 수 있습니다. 그들은 어느 쪽이 유용한 지에 대해 의견이 맞지 않을 수 있으므로 적극적으로 구현하지 않기로 결정할 수 있습니다.


1

그들의 핵심에서 refout받는 할당 -이 업데이트 될 수 있도록하는 방법에 변수의 주소를 전달하는 메커니즘을 제공 ref하거나 out매개 변수는 호출자의 컨텍스트에서 변수를 업데이트합니다. 그것들이 다른 곳은 보증에 있습니다 : out변수가 업데이트되도록 보장 ref하지 않습니다.

통화 반대편에서도 비슷한 차이점이 있습니다. out메소드에 대한 매개 변수는 도착시 유용한 것을 포함한다고 보장하지 않으며, 어느 시점에서 값으로 설정되어야하지만, ref매개 변수는 값을 갖는 것으로 가정 할 수 있으며 특정 조치를 취할 필요는 없습니다.

이 차이는 코드 분석, 생성 및 최적화에 영향을 미치며, 대부분의 경우 우리에게는별로 명백하지는 않지만 프로그램 운영 방식에 영향을 줄 수 있습니다. 코드 생성기는 호출 직전에 변수 할당을 연기 할 수 있으며, 옵티마이 저는 계약 등에 따라 일부 작업을보다 효과적으로 재정렬 할 수 있다고 결정할 수 있습니다.

사용법 측면에서, 일반적으로 out변수로 매개 변수로 도착 ref했을 때 와 내가 할 때 변수의 내용에 신경 쓰지 않는 상황에 사용 합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.