我有一个对象是我在程序的内存状态,还有一些其他的工作函数,我传递对象来修改状态.我已经通过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);
Run Code Online (Sandbox Code Playgroud)
它混淆了我,因为两者received_s并remoteEP从函数返回的东西.为什么remoteEP需要一个ref而received_s不是一个?
我也是程序员,所以我有一个问题,我的头脑中有指针.
编辑:看起来C#中的对象是引导下对象的指针.因此,当您将对象传递给函数时,您可以通过指针修改对象内容,传递给函数的唯一内容是指向对象的指针,因此对象本身不会被复制.如果您希望能够在函数中切换或创建一个新对象,就像双指针一样,则使用ref或out.
看看以下程序:
class Test
{
List<int> myList = new List<int>();
public void TestMethod()
{
myList.Add(100);
myList.Add(50);
myList.Add(10);
ChangeList(myList);
foreach (int i in myList)
{
Console.WriteLine(i);
}
}
private void ChangeList(List<int> myList)
{
myList.Sort();
List<int> myList2 = new List<int>();
myList2.Add(3);
myList2.Add(4);
myList = myList2;
}
}
Run Code Online (Sandbox Code Playgroud)
我假设myList已经过去了ref,输出会
3
4
Run Code Online (Sandbox Code Playgroud)
该列表确实"通过ref传递",但只有该sort函数生效.以下声明myList = myList2;无效.
所以输出实际上是:
10
50
100
Run Code Online (Sandbox Code Playgroud)
你能帮我解释一下这个行为吗?如果确实myList没有通过ref(因为它看起来myList = myList2没有生效),如何myList.Sort()生效?
我甚至假设该语句不生效,输出为:
100
50
10
Run Code Online (Sandbox Code Playgroud)