运行时?绝对没有。您不能重载仅具有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 call 6E6B601E
00000025 nop
param = 0;
00000026 MOV EAX,DWORD PTR [
EBP - 40H ] 00000029 XOR EDX,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)相同;唯一的区别是编译器为防止错误而强制执行一些约束。(我不会将其发布为答案,因为我可能对此不太了解,但我想这是可行的(因为它是有道理的))