문제

나는 명확하고 간결하며 정확한 답변을 찾고 있습니다.

좋은 설명에 대한 링크는 환영하지만 이상적으로는 실제 답변입니다.

이는 VB.Net에도 적용되지만 키워드는 다릅니다. ByRef 그리고 ByVal.

도움이 되었습니까?

해결책

기본적으로(C#에서는) 개체를 함수에 전달하면 실제로 해당 개체에 대한 참조 복사본이 전달됩니다.매개변수 자체를 변경하면 매개변수의 값만 변경되고 지정된 변수는 변경되지 않습니다.

void Test1(string param)
{
    param = "new value";
}

string s1 = "initial value";
Test1(s1);
// s1 == "initial value"

사용 out 또는 ref 함수 호출에 지정된 변수에 대한 참조를 전달합니다.값에 대한 모든 변경 사항 out 또는 ref 매개변수가 호출자에게 다시 전달됩니다.

둘 다 out 그리고 ref 한 가지 약간의 차이점을 제외하고는 동일하게 동작합니다. ref 매개변수는 호출하기 전에 초기화해야 합니다. out 매개변수는 초기화되지 않을 수 있습니다.확장하여, ref 매개변수는 메서드 시작 시 초기화되는 것이 보장됩니다. out 매개변수는 초기화되지 않은 것으로 처리됩니다.

void Test2(ref string param)
{
    param = "new value";
}

void Test3(out string param)
{
    // Use of param here will not compile
    param = "another value";
}

string s2 = "initial value";
string s3;
Test2(ref s2);
// s2 == "new value"
// Test2(ref s3); // Passing ref s3 will not compile
Test3(out s2);
// s2 == "another value"
Test3(out s3);
// s3 == "another value"

편집하다:처럼 DP 의 차이점을 지적한다. out 그리고 ref CLR이 아닌 C# 컴파일러에 의해서만 적용됩니다.내가 아는 한 VB에는 다음과 같은 기능이 없습니다. out 그리고 구현 ref (처럼 ByRef)만 CLR 지원과 일치합니다.

다른 팁

ref와 ref에 대한 추가 참고 사항밖으로:둘 사이의 구별은 C# 컴파일러에 의해 적용됩니다.CLR은 out과 ref를 구분하지 않습니다.이는 out 또는 ref만 서명이 다른 두 가지 메서드를 가질 수 없음을 의미합니다.

void foo(int value) {}

// Only one of the following would be allowed

// valid to overload with ref
void foo(ref int value) {}

// OR with out
void foo(out int value) {}

out 이는 매개변수가 다음 메소드에 의해 초기화됨을 의미합니다.

int result; //not initialised

if( int.TryParse( "123", out result ) )
   //result is now 123
else
   //if TryParse failed result has still be 
   // initialised to its default value (0)

ref 기본 참조가 강제로 전달됩니다.

void ChangeMyClass1( MyClass input ) {
   input.MyProperty = "changed by 1";
   input = null;
   //can't see input anymore ... 
   // I've only nulled my local scope's reference
}

void ChangeMyClass2( ref MyClass input ) {
   input.MyProperty = "changed by 2";
   input = null;
   //the passed reference is now null too.
}

MyClass tester = new MyClass { MyProperty = "initial value" };

ChangeMyClass1( tester );
// now tester.MyProperty is "changed by 1"

ChangeMyClass2( ref tester );
// now tester is null

stackoverflow의 내 질문 중 하나도 이 주제를 다루고 있습니다.
그것은 대략 처리합니다 "참조로 전달" 및 "값으로 전달" 다양한 언어로, C#이 포함되어 있습니다 어쩌면 거기에서 추가 정보도 찾을 수 있을 것입니다.

기본적으로 다음과 같습니다.

  • 참조:ref 키워드가 포함된 매개변수가 전달됩니다. 참고로
  • 밖으로:out 키워드가 있는 매개변수는 출력 매개변수

하지만 이는 실제로 여러분이 줄 수 있는 가장 기본적인 답변입니다. 여기에 명시된 것보다 조금 더 복잡하기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top