2017-04-07 4 views
2

에서 키워드 '에서'. 예를 들어 msdn 사이트 (https://msdn.microsoft.com/en-us/library/ee332485.aspx)에서 : "... 다음 예제에서는 을 반환합니다. 단일 메서드 호출로 세 개의 변수가 반환됩니다."반환 여러 값이 나는 현재 '아웃'키워드로 우리가 <strong><em>반환</em></strong> 여러 값을 수 있는지 진술 때 그것이 무엇을 의미하는지 이해하기 위해 사투를 벌인거야 C#을

class OutReturnExample 
{ 
    static void Method(out int i, out string s1, out string s2) 
    { 
     i = 44; 
     s1 = "I've been returned"; 
     s2 = null; 
    } 
    static void Main() 
    { 
     int value; 
     string str1, str2; 
     Method(out value, out str1, out str2); 
     // value is now 44 
     // str1 is now "I've been returned" 
     // str2 is (still) null; 
    } 
} 

난 그냥 설명 잘 읽어 아니에요 있는지 확실하지 않습니다하지만 방법은()에서 아무것도 실제로는 반환하지 않습니다합니다 ('반환'키워드를 사용하지 않는) 것 같다 all과 기본적으로 필드를 지정합니다 (마찬가지로 ref를 통해 전달합니다). 이것은 'out'을 사용하여 다른 소스와 일치 할 수 있습니다. return 여러 값. 반환 단어의 컨텍스트를 잘못 이해하고 있습니까, 아니면 내가 컨셉을 제대로 이해하지 못하고있는 라인에있는 것입니까?

+1

키워드'out'은 메소드 호출 후에 그 변수가 할당되어야 함을 의미합니다. – dcg

+2

반환과 의미 상 동일합니다. 메서드를 호출하면 반환 유형이있는 메서드를 호출하고 결과로 하나의 변수가 채워지는 것처럼 결과가 채워진 "out"변수가 있습니다. – Evk

+1

'out' 키워드는 외부 범위에있는 모든 값이 "생성"및 "할당"됨을 의미합니다. 'out'은 현재의 mehtod에서 그 값들을 변경해야한다는 계약을 선언했기 때문에 리턴 된 것이라고 말할 수 있습니다. –

답변

6

이 메소드는 올바르게 인식하여 값을 반환하지 않습니다. refout 모두 참조와 함께 작동합니다.

ref은 변수가 함수에 들어가기 전에 변수가 이미 초기화되어 있어야한다는 것을 컴파일러가 알 수있게합니다 (이 함수 앞에 변수를 사용하고 지금 뭔가를 변경하려고 할 때 유용합니다). out은 호출하는 함수 안에서 객체가 초기화되었음을 컴파일러에 알립니다. 따라서 ref은 두 가지 방식으로 작동합니다. out은 발신 전용입니다.

그래, 실제로 반환하지 않습니다. 그러나 다른 한편으로, 호출 메소드가 새로운 값으로 끝나는 변수에 값을 할당합니다. 근본적으로 이것을 반환으로 볼 수 있습니다. 짧은 그래서

:

  • ref 매개 변수 - 다음은 C++ 참조 매개 변수와 동일한 기능을 가지고 있고,

  • out 매개 변수를 - 이러한 방법에서 다시 데이터를 전달 할 수 있지만 메서드에.

나는 또한 당신이 this SO answer 및 매개 변수 전달에 대한 존 소총의 corresponding blog을 읽으십시오. 그것은 당신에게 개념에 대한 많은 정보를 줄 것입니다. refout를 사용하는 경우 그리고 존 소총 노트로,주의 :

그것은 기본적으로 다른 반환 값을 얻기의 방법이고,이 방법의 아마 너무 많은 일을하려고 의미하기 때문에 일반적으로 정확하게 피해야한다.

+2

@ xanatos 나는 그것을 분명히하기 위해 그것을 바 꾸었습니다. 그것을 지적 주셔서 감사합니다! – Jurjen

3

return이라는 용어는 키워드로 사용되는 의미가 아니라 의미 적 의미로 사용됩니다.

  1. 매개 변수 입력을 위해 사용되지 않습니다 : 당신이 out 키워드를 사용할 때

    의미 적, 당신은 두 가지를 지정하고 있습니다.

  2. 메서드가 반환되기 전에 매개 변수 값이 확실히 지정됩니다.

이와 관련하여 out 매개 변수는 메서드에서 반환되는 값입니다.

컴파일러는 이러한 의미를 적용합니다. 다음 코드는 경고의 몇 생성합니다

public static void Test(out int x) 
{ 
    Console.WriteLine(x); 
} 

오류 CS0177 아웃 된 매개 변수를 'X'제어가 현재의 방법을 x '를 밖으로 할당되지 않은 매개 변수의

오류 CS0269 사용을 떠나기 전에 할당해야합니다 '

C# 7 (별칭 Visual Studio 2017)을 사용하면 메서드 호출 내에서 변수를 선언 할 수 있습니다.

을 감안할 때 :

public static void Test(out int x, out int y) 
{ 
    x = 1; 
    y = 2; 
} 

C# 7는이 작업을 수행 할 수 있습니다

Test(out int x, out int y); 
Console.WriteLine($"x = {x}, y = {y}"); 

이 구문은 변수 선언에서 초기화되고 있기 때문에 무언가가, "반환"되고 있음을 더 분명하게 같은 진술.

또한 C# 7에서는 out 대신 튜플을 사용할 수 있습니다. 이것은 훨씬 더 좋다고 생각합니다 (람다와 함께 더 잘 작동합니다!).

C#으로 다음과 같은 예를 들어 위의 다시 작성할 수 있습니다 7 : 당신이 할 수있는 그런

public static (int x, int y) Test() 
{ 
    int x = 1; 
    int y = 2; 
    return (x, y); 
} 

:

(int x, int y) = Test(); 
Console.WriteLine($"x = {x}, y = {y}"); 
3

네 말이 맞아, 방법 할 수있는 유일한 반환 (당신이 말하고 있다는 의미에서) 한 가지만. 또는 선언에 따라 (반환 유형 void) 메서드가 완료되면 호출 코드에 아무 것도 반환하지 않습니다. -의 한 가지이지만, 여러 값을 포함 할 수 있습니다 (속성

  1. 돌려 class 또는 struct : 당신이 당신의 방법에서 다시 여러 값을 얻고 싶다면

    , 당신은 몇 가지 옵션을 가지고 그 일)

  2. 예제에 따라 out 수정자를 사용하여 일부 매개 변수를 메소드에 전달하십시오. outref과 비슷하지만 실제 값을 복사하는 것이 아니라 실제 값을 처리하고 있습니다.그러나 ref과 달리 메서드는 메서드가 완료되기 전에 out으로 표시된 매개 변수에 값을 할당해야합니다. 그렇지 않으면 컴파일러 오류가 발생합니다. out 수정자를 사용하여 여러 매개 변수를 가질 수 있습니다.

그래서 당신이 반환에 의해 무엇을 의미하는지에 조금 따라 달라집니다. 반환 값의 의미에서 예제 코드는 아무 것도 반환하지 않으며 (반환 형식은 void으로 선언 됨) 반환 형식을 사용하도록 변경 한 경우 반환 값으로 반환 할 수있는 값은 최대 하나 일 수 있습니다. 그러나 메소드 내에서 수행 된 작업에 대한 호출 코드를 알려주는 의미에서, out 매개 변수를 사용하면 여러 값에 대해 수행 할 수 있습니다.

관련 문제