Why does C# make a distinction between ref and out?
根据这篇文章,ref和out之间存在区别的原因是使用ref时复制变量值的成本较高。
为什么首先需要马歇尔?C不只是把指针放在引擎盖下面吗?在这种情况下,不需要复制值。
- 你能解释一下你为什么提到编组吗
- 作为回答,链接作者提到了封送到不同进程,所以指针不再相关,因为每个进程都有自己的虚拟内存。
- @我指的是一个windows进程。我不认为作者实际上是指不同的Windows进程。
- @链接的帖子里提到了它。
- @用户3126319从你链接的答案:"这是一个很大的区别,当数据需要编组,例如到另一个进程,这可能是昂贵的。"这意味着当数据需要编组,参考意味着发送以前的价值,当出没有。也看看所有相关的问题在右边栏,他们有相当好的答案。
- @Olehnechytailo是否需要整理引用值,而不是将一个值从一个流程复制到另一个流程?
- @用户3126319不通过引用其他文章来提供详细信息。请在这里问你的问题。
- 所有相关的链接都解释了ref和out之间的区别。他们都不能真正解释为什么有区别。
- 语义差异,编译器检查,编组行为,所有这些都在这里解释。
- @戴维德芬南,这就是我为什么这么做的原因。我提到另一篇文章的唯一原因是你问我为什么提到马歇尔。我有什么理由不提马歇尔吗?
- @Olehnechytailo我认为在这个设计决策背后会有一个更重要的原因,除了语义差异(我并不觉得这有帮助)和需要将一个变量从一个过程复制到另一个过程的情况。
- @用户3126319如果愿意,请提及编组。因此,您只对pinvoke的ref和out之间的差异感兴趣吗?
- @大卫:是的,我很感兴趣,如果它解释了设计决策,把ref和out都放在c中。
因为二者的语义完全不同。
out参数用于指示它将用于返回(输出)值,仅此而已。
另一方面,ref参数表示应通过引用将现有对象(变量)传递给方法。在C的上下文中,通过引用传递的对象(不要被引用类型混淆)通常是一个提示,该方法将(并且应该)修改该对象。它不应该"仅仅因为"使用。它通常只用于值类型,因为它是获取它们的引用语义的唯一方法。
- 这两种语言的语义并不像C所假装的那样不同。将一个字段传递给实际的out参数应使该字段保持不变,直到方法返回时为止;相反,作为out参数传递的字段的行为将类似于作为ref传递的字段,但编译器将坚持在将变量传递为ref之前必须分配变量,并且将假设以out形式传递的变量已被分配。