为啥 C# 区分 ref 和 out? [复制]

Posted

技术标签:

【中文标题】为啥 C# 区分 ref 和 out? [复制]【英文标题】:Why does C# make a distinction between ref and out? [duplicate]为什么 C# 区分 ref 和 out? [复制] 【发布时间】:2014-01-11 02:27:37 【问题描述】:

根据这个post,refout之间存在区别的原因是因为在使用ref时复制变量的值是昂贵的。

为什么首先需要编组? C# 不只是在引擎盖下传递指针吗?在这种情况下,就不需要复制值了。

【问题讨论】:

你能解释一下你为什么提到编组 在回答你链接的作者说关于编组到不同的进程,所以指针不再相关,因为每个进程都有它自己的虚拟内存。 @OlehNechytailo:我指的是一个 Windows 进程。我不认为作者的意思实际上是不同的 Windows 进程。 @DavidHeffernan 链接的帖子提到了它。 @user3126319 不要通过参考其他帖子来提供详细信息。请在这里提出您的问题。 【参考方案1】:

因为两者的语义完全不同。

out 参数用于表示它将用于返回(输出)一个值,仅此而已。

另一方面,ref 参数表示现有对象(变量)应通过引用传递给方法。在 C# 的上下文中,通过引用传递的对象(不要被引用类型混淆)通常暗示该方法将(并且应该)修改该对象。不应该“仅仅因为”使用它。它通常仅用于值类型,因为它是获取它们的引用语义的唯一方法。

【讨论】:

两者的语义并没有 C# 所假装的那么不同。将字段传递给真正的out 参数应该使该字段保持不变,直到方法返回;相反,作为out 参数传递的字段的行为与作为ref 传递的字段一样,除了编译器会坚持必须先分配变量,然后才能将它们作为ref 传递,并假设变量传递为out 已分配。

以上是关于为啥 C# 区分 ref 和 out? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C# 初识Ref和Out

C#中关键字ref和out的区别

转载:C#中ref和out的区别浅析

C#中ref和out的区别浅析

Ref和Out之间的差异是啥? [复制]

c# out ref