使用 C# 中的方法更改另一个范围内的变量值
Posted
技术标签:
【中文标题】使用 C# 中的方法更改另一个范围内的变量值【英文标题】:changing value of variable on another scope with method in C# 【发布时间】: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 中描述了此行为。 (奇怪的是,该指南认为不适合在引用类型和数组的专门主题中描述数组是引用类型,尽管这是一件很重要的事情。)
开枪!你说得对。谢谢。
【参考方案1】:
Byte[] 是一个引用类型;您正在传递对字节类型数组的引用。 您可以改变其内容,但不能改变引用本身。
【讨论】:
以上是关于使用 C# 中的方法更改另一个范围内的变量值的主要内容,如果未能解决你的问题,请参考以下文章
在本机 C++ 中将变量从 C# 编组为 void*,并在本机程序内更改 Managed/C# 中的变量值
JavaScript,当变量作为参数传递时更改函数内部的变量值[重复]