一尘不染

何时使用ref以及何时在C#中不必要

c#

我有一个对象,它在程序的内存状态中,并且还有一些其他工作函数,我将该对象传递给该函数以修改状态。我一直在通过ref传递给worker函数。但是我遇到了以下功能。

byte[] received_s = new byte[2048];
IPEndPoint tmpIpEndPoint = new IPEndPoint(IPAddress.Any, UdpPort_msg);
EndPoint remoteEP = (tmpIpEndPoint);

int sz = soUdp_msg.ReceiveFrom(received_s, ref remoteEP);

这使我感到困惑,因为received_sremoteEP都从函数返回了东西。为什么remoteEP需要一个refreceived_s不?

我也是交流程序员,所以在将指针弄出头脑时遇到了问题。

编辑:看起来C#中的对象是指向底层对象的指针。因此,当您将对象传递给函数时,可以通过指针修改对象的内容,唯一传递给该函数的是对象的指针,这样就不会复制对象本身。如果希望能够在函数中切换或创建一个类似于双指针的新对象,则使用ref或out。


阅读 400

收藏
2020-05-19

共1个答案

一尘不染

简短的答案:阅读我关于论证传递的文章

长答案:当通过值传递引用类型参数时,仅传递引用, 而不 传递对象的副本。这就像在C或C
++中传递指针(按值)。更改参数本身的值将不会被呼叫方可以看到,但改变其中的参考点到对象 被看见。

通过 引用传递(任何类型的)参数时,这意味着调用者可以看到对参数的任何更改-对参数 更改就是对变量的更改。

当然,本文更详细地解释了所有这些:)

有用的答案: 您几乎不需要使用ref / out
。从根本上讲,这是获取另一个返回值的一种方法,通常应严格避免使用它,因为这意味着该方法可能尝试做太多事情。情况并非总是如此(TryParse等等是合理使用的规范示例out),但是使用ref
/ out应该是相对稀有的。

2020-05-19