3

6 답변


19

발신자의 경우 :

  • ref 매개 변수의 경우 변수가 이미 할당되어 있어야합니다.
  • out 매개 변수의 경우 변수를 반드시 할당 할 필요는 없지만 메서드가 반환 된 후에 변수가 지정됩니다.

방법 :

  • ref 매개 변수는 할당 된 상태로 시작되며,있다그것에 어떤 값을 할당하는 것
  • 출력 매개 변수하지 않는다확실히 할당 된 상태로 시작하고, 예외없이 (예외없이) 언제든지 반환해야합니다.의지틀림없이 할당되다.

그래서:

int x;
Foo(ref x); // Invalid: x isn't definitely assigned
Bar(out x); // Valid even though x isn't definitely assigned
Console.WriteLine(x); // Valid - x is now definitely assigned

...

public void Foo(ref int y)
{
    Console.WriteLine(y); // Valid
    // No need to assign value to y
}

public void Bar(out int y)
{
    Console.WriteLine(y); // Invalid: y isn't definitely assigned
    if (someCondition)
    {
        // Invalid - must assign value to y before returning
        return;
    }
    else if (someOtherCondition)
    {
        // Valid - don't need to assign value to y if we're throwing
        throw new Exception();
    }
    else
    {
        y = 10;
        // Valid - we can return once we've definitely assigned to y
        return;
    }
}


  • CLR에는 ref에 대한 개념이 없지만 실제로 흥미로운 점은 무엇입니까? 그것은 C #의미 체계입니다. - JaredPar
  • CLR이 심판을 이해하지만 심판을 이해할 수 없다는 것을 의미합니까? - Jon Skeet
  • (나는 어쨌든 - C #컴파일러가 out 메서드에 [Out] 특성을 추가하고 적절한 검사를 수행하지만 실제로는 ref 매개 변수라고 생각했습니다.) - Jon Skeet
  • @ 존, 어! 네, 맞습니다. 나는 그것을 뒤로 가진다. - JaredPar
  • 그 덕분에 고맙습니다. 내 지식, 정체성, 영혼 및 존재의 전부는 그 사실에서 파생됩니다. 나는 벼랑에 떨고 있었다. (정말로, 나는 놀랐고 약간 교란되었을 것이다.) - Jon Skeet

3

그것을 보는 가장 간결한 방법 :

ref = inout

아웃 = 아웃



2

만나다MSDN의 기사 둘 다 미묘하게 다른 일을 수행합니다.


1

Ref 및 Out 매개 변수 전달 모드는 메소드가 호출자가 전달한 변수를 변경하는 데 사용됩니다. 심판과 심판의 차이는 미묘하지만 중요합니다. 각 매개 변수 전달 모드는 약간 다른 프로그래밍 시나리오에 적용되도록 설계되었습니다. out과 ref 매개 변수 사이의 중요한 차이점은 각각에 의해 사용되는 명확한 할당 규칙입니다.

out 매개 변수를 사용하는 메서드 호출자는 호출 전에 out 매개 변수로 전달 된 변수에 할당 할 필요가 없습니다. 그러나 호출 수신자는 반환하기 전에 out 매개 변수에 할당해야합니다.

출처:MSDN


1

Alex가 언급 한 MSDN 기사에서,

out 매개 변수를 사용하는 메서드 호출자는 호출 전에 out 매개 변수로 전달 된 변수에 할당 할 필요가 없습니다. 그러나 호출 수신자는 반환하기 전에 out 매개 변수에 할당해야합니다.

반대로 ref 매개 변수는 호출 수신자가 처음에 할당 한 것으로 간주됩니다. 따라서 호출 수신자는 사용하기 전에 ref 매개 변수에 할당 할 필요가 없습니다.

요약하면, 메소드 내에서 ref 매개 변수를 설정할 수 있지만 매개 변수는 제외한다고 간주 할 수 있습니다.이를 설정해야합니다. 방법 밖에서도 똑같이 행동해야합니다.


0

C #에서 params에 대한이 Jon Skeet 기사를 확인하십시오.

http://www.yoda.arachsys.com/csharp/parameters.html

연결된 질문


관련된 질문

최근 질문