메소드 매개변수에서 ref, val 및 out은 무엇을 의미합니까?
문제
나는 명확하고 간결하며 정확한 답변을 찾고 있습니다.
좋은 설명에 대한 링크는 환영하지만 이상적으로는 실제 답변입니다.
이는 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 키워드가 있는 매개변수는 출력 매개변수
하지만 이는 실제로 여러분이 줄 수 있는 가장 기본적인 답변입니다. 여기에 명시된 것보다 조금 더 복잡하기 때문입니다.