2012-03-26 6 views
8

대 나는 두 가지 방법이 있나요?C# 통과 참조 형 직접 출력 매개 변수

List<int> numsA = new List<int>(); 
A(numsA); 

List<int> numsB = new List<int>(); 
B(out numsB); 

일반적으로 참조 형식을 그대로 또는 out 매개 변수로 전달하는 것의 차이점을 이해하려고합니다.

답변

0

out 키워드는 인수가 참조로 전달되도록합니다. ref 키워드가 전달되기 전에 변수 이 초기화되어야한다는 점을 제외하면 ref 키워드와 비슷한 입니다. out 매개 변수를 사용하려면 메서드 정의와 호출 메서드 모두 명시 적으로 out 키워드를 사용해야합니다. 예를 들어 : out 매개 변수가 초기화되지 않은 것으로 간주되기 때문에 당신은 당신이 그것을 사용하기 전에 초기화해야합니다 귀하의 예에서

http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

6

, 방법 B는 컴파일되지 않습니다. 또한 out 매개 변수와 함께 메서드를 호출 할 때, 당신은 전화 사이트에서 out 키워드를 지정해야합니다

B(out numsB); 

을 그리고 그것은 덮어 쓰기 때문에 당신은 호출하기 전에 numbsB 변수를 초기화 할 필요가 없습니다 그 방법으로

존 소총이 매개 변수를 전달하는 다양한 방법을 설명하는 좋은 기사가 있습니다 버전 B에서 Parameter passing in C#

0

을, 함수는 변수에 직접 액세스 할 수 있습니다. 변수를 매개 변수를 사용하여 함수 내에서 지정해야한다는 점을 제외하면 'ref'키워드와 같습니다. 함수에서 여러 값을 반환 할 수 있습니다. 호출 구문은 'B (out numsB);'입니다.

3

로컬 변수와 같이 non-ref, non-out 매개 변수는 저장 위치를 ​​나타냅니다. 저장 영역 위치 유형이 참조 유형 인 경우, 저장 영역 위치는 해당 유형의 인스턴스에 대한 참조를 보유합니다.

대조적으로 참조 번호는 이고 저장 위치는입니다. 저장 위치는 지역 변수, 필드 또는 배열 요소 일 수 있습니다. 즉, ref 및 out 매개 변수는 간접 참조의 또 다른 계층을 도입합니다. 메소드에 참조 유형 ref 또는 out 매개 변수가 있으면 오브젝트에 대한 참조에 대한 참조를 나타냅니다.

왜 개체에 대한 참조를 원하겠습니까? 개체에 대한 참조를 수정해야하는 경우 (개체 자체를 수정하는 것과 반대)

일부 좁은 환경에서는 유용한 기술입니다.이 방법에서 하나 개 이상의 값을 반환하려면 매개 변수 아웃

void OrderQueues(ref Queue<int> a, ref Queue<int> b) 
{ 
    if (a.Peek <= b.Peek) return; 
    var temp = a; 
    a = b; 
    b = temp; 
} 

가 유용하다 :

예를 들어, 두 개의 큐가있는 상단에있는 작은 값을 가지고 따라 주문하는 함수를 작성 할 수 있습니다
void OldestAndYoungest(IEnumerable<Person> people, out Person youngest, out Person oldest) 
{ 
    youngest = null; 
    oldest = null; 
    foreach (var person in people) 
    { 
     if (youngest == null || person.Age < youngest.Age) 
      youngest = person; 
     if (oldest == null || oldest.Age < person.Age) 
      oldest = person; 
    } 
} 

내 경험상 ref 및 out 매개 변수는 매우 드물고 참조 유형이 더 적습니다.

호출자가 ref 매개 변수를 초기화해야하며 out 매개 변수는 호출 수신자가 초기화해야합니다. ref 매개 변수에 값을 할당하지 않으면 "보통"매개 변수 여야합니다. 예와 같이 out 매개 변수에 값을 할당하지 않으면 코드가 컴파일되지 않습니다.