【发布时间】:2021-12-20 20:31:59
【问题描述】:
我在 .NET.Sockets 中遇到了一个叫做“Recieve()”的奇怪方法 .Recieve() 方法在不使用 ref 或 out 的情况下更改 buff 变量。谁能给我解释一下。
完整代码:
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddr = IPAddress.Any;
IPEndPoint endPoint = new IPEndPoint(ipAddr, 23000);
server.Bind(endPoint);
server.Listen(5);
Socket client = server.Accept();
Console.WriteLine("Client endpoint : " + client.RemoteEndPoint.ToString());
byte[] buff = new byte[128];
//this method confuses me Receive(buff)
int numberOfRecievedBytes = client.Receive(buff);
Console.WriteLine("Number of Recieved Bytes: " + Encoding.ASCII.GetString(buff, 0, numberOfRecievedBytes));
【问题讨论】:
-
byte[]是一个引用类型。任何方法都可以修改作为参数传递的数组的内容(如果没有ref或out,它们不能修改buff本身的引用,但这是另一回事)。 -
C# 编程指南here 中描述了此行为。 (奇怪的是,该指南认为不适合在引用类型和数组的专门主题中描述数组是引用类型,尽管这是一件很重要的事情。)
-
开枪!你说得对。谢谢。