何时使用ref,何时在C#中不需要

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

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需要一个ref并且received_s不需要?

我也是ac程序员,所以我有一个问题在我头脑中出现。

编辑:它看起来像C#中的对象是指向引擎盖下的对象的指针。 所以当你传递一个对象到一个函数时,你可以通过指针修改对象内容,唯一传递给函数的是指向对象的指针,所以对象本身不被复制。 如果您希望能够在函数中切换或创建一个新对象,就像使用双指针一样,您可以使用ref或out。


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

长答案:当一个引用类型参数按值传递时,只传递引用,而不是对象的副本。 这就像在C或C ++中传递一个指针(按值)。 调用者不会看到参数本身值的变化,但参考指向的对象会发生变化。

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

文章当然更详细地解释了这一切:)

有用的答案: 你几乎不需要使用ref / out 。 这基本上是获得另一个返回值的方法,通常应该避免,因为这意味着该方法可能会尝试做太多。 这并不总是这样( TryParse等合理使用的规范例子out ),但使用REF /输出应该是一个相对罕见。


将一个非参数参数看作是一个指针,将一个参数指定为一个双指针。 这对我帮助最大。

你几乎不应该通过ref传递值。 我怀疑,如果不是出于互操作的考虑,.Net团队将永远不会将其纳入原始规范。 处理参考参数解决的大多数问题的OO方式是:

对于多个返回值

  • 创建表示多个返回值的结构
  • 对于作为方法调用结果而改变方法的基元(方法对原始参数有副作用)

  • 作为实例方法在对象中实现该方法,并将该对象的状态(而不是参数)作为方法调用的一部分进行操作
  • 使用多重返回值解决方案并将返回值合并到您的状态
  • 创建一个包含状态的对象,该状态可以由方法操作并将该对象作为参数传递,而不是基元本身。

  • 您可能可以编写一个完整的C#应用​​程序,并且绝不会传递任何对象/结构。

    我有一位教授告诉我这个:

    你唯一可以使用的地方是你:

  • 想要传递一个大对象(即对象/结构体中有对象/结构体到多个级别),并且复制它会很昂贵,
  • 您正在调用一个Framework,Windows API或其他需要它的API。
  • 不要只因为可以。 如果您开始更改参数中的值并且不注意,您可以通过一些令人讨厌的错误获得一些帮助。

    我同意他的建议,在我上学五年多的时间里,除了调用Framework或Windows API之外,我从来没有需要过它。

    链接地址: http://www.djcxy.com/p/73751.html

    上一篇: When to use ref and when it is not necessary in C#

    下一篇: What's the difference between SoftReference and WeakReference in Java?