gpt4 book ai didi

c# - 在 C# 中何时使用 ref 以及何时不需要

转载 作者:IT王子 更新时间:2023-10-29 03:35:48 26 4
gpt4 key购买 nike

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

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 程序员,所以我无法从头脑中获取指针。

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

最佳答案

简答:阅读我的 article on argument passing .

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

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

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

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

关于c# - 在 C# 中何时使用 ref 以及何时不需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/635915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com