런타임 ? 물론 없습니다. ref 또는 out 키워드 만 다른 매개 변수가 동일한 메소드를 오버로드 할 수 없습니다.
이것을 컴파일하려고하면 "동일한 서명을 가진 방법이 이미 선언되었습니다"라는 컴파일 오류가 발생합니다.
private class MyClass
{
private void DoSomething(out int param)
{
}
private void DoSomething(ref int param)
{
}
}
이 질문에 대답하기 위해 :
"... 왜 C #에 이렇게 좁은 사용 사례를위한 두 개의 매우 유사한 도구가 있습니까?"
코드 가독성과 API 관점에서 보면 큰 차이가 있습니다. API 소비자로서 "out"이 사용될 때 API는 out 매개 변수에 의존하지 않는다는 것을 알고 있습니다. API 개발자로서 나는 "out"을 선호하고 절대적으로 (거의!) 필요할 때만 "ref"를 사용합니다. 훌륭한 토론을 위해이 참조를보십시오 :
/programming/1516876/when-to-use-ref-vs-out
지원 정보 : 다음 방법을 컴파일하고 분해했습니다. ref 및 out 키워드를 사용했지만 (이 예에서는 out) 주소 코드를 제외하고는 어셈블리 코드가 변경되지 않았습니다.
private class MyClass
{
internal void DoSomething(out int param)
{
param = 0;
}
}
00000000 push ebp
00000001 mov ebp, esp
00000003 push edi
00000004 push esi
00000005 push ebx
00000006 sub esp, 34h
00000009 xor eax, eax
0000000b mov dword ptr [ebp-10h], eax
0000000e mov dword ptr [ebp-1Ch], eax
00000011 mov dword ptr [ebp-3Ch], ecx
00000014 mov dword ptr [ebp-40h], edx
00000017 cmp dword ptr ds : [008B1710h], 0
0000001e je 00000025
00000020 전화 6E6B601E
00000025 nop
param = 0;
00000026 mov eax, dword ptr [ebp-40h]
00000029 xedx, edx
0000002b mov dword ptr [eax], edx
}
0000002d nop
0000002e lea esp, [ebp-0Ch]
00000031 pop ebx
00000032 pop esi
00000033 pop edi
00000034 pop ebp
00000035 ret
어셈블리를 올바르게 읽고 있습니까?
ref
C ++에서 와 같은 방식으로 구현된다 . 문제의 객체 포인터 (또는 프리미티브)에 대한 포인터. 즉Int32.TryParse(myStr, out myInt)
(C #)는int32_tryParse(myStr, &myInt)
(C) 와 같은 방식으로 "실행"됩니다 . 유일한 차이점은 컴파일러가 버그를 방지하기 위해 시행하는 몇 가지 제약 조건입니다. (나는 뒤에서 어떻게 작품에 대해 잘못 될 수 있기 때문에 대답으로이 게시 않을거야,하지만 내가 [그것이 의미하게 때문에] 작동 구상하는 방법입니다)