C#字节数组受无引用方法的影响
这是一个使用异步套接字接收数据的有效(无用)示例。 完整的代码可在中找到 在C#字节数组受无引用方法的影响,c#,sockets,C#,Sockets,这是一个使用异步套接字接收数据的有效(无用)示例。 完整的代码可在中找到 在BeginReceive方法中,应该不可能影响state.buffer字段,因为没有ref或out关键字 但字节数组实际上有一个已更改的值 在ReceiveMethode中,state.buffer字段怎么可能是空的,然后在ReceiveCallback方法中访问时包含所有接收到的数据?如果您花时间至少阅读您发布的MSDN链接上的评论,您就会明白发生了什么: 开始从远程设备接收数据。 client.BeginReceiv
BeginReceive
方法中,应该不可能影响state.buffer
字段,因为没有ref
或out
关键字
但字节数组实际上有一个已更改的值
在
Receive
Methode中,state.buffer
字段怎么可能是空的,然后在ReceiveCallback
方法中访问时包含所有接收到的数据?如果您花时间至少阅读您发布的MSDN链接上的评论,您就会明白发生了什么:
开始从远程设备接收数据。
client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
int bytesRead = client.EndReceive(ar);
从远程设备读取数据。
client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
int bytesRead = client.EndReceive(ar);
下一次,花更多的时间阅读和理解已经解释的内容,然后再声明什么是可能的或不可能的
不可能影响state.buffer字段,因为没有ref或out关键字
不,这不是真的。state.buffer
指向的实际对象可以通过另一种方法更改,但不能更改其引用
下面是一个简单的例子:
static void Main()
{
byte[] arr = new byte[] { 1, 2, 3, 4, 5 };
ChangeTheObject(arr);
foreach(byte b in arr) {
Console.WriteLine(b);
}
}
static void ChangeTheObject(byte[] arr)
{
arr[2] = 7;
}
Main()
将打印
1
2
7
4
5
对象本身可以通过接收它的方法进行更改
但是,您不能更改引用本身
static void ChangeTheReference(byte[] arr)
{
arr = new byte[] { 6, 7, 8, 9, 10 };
}
这不会更改Main()
中原始数组的内容,因为您已将本地引用重新分配给新对象。您没有更改原始对象。这就是ref
关键字派上用场的地方
示例中的方法是更改数组的内容,而不是引用。在本例中,
缓冲区是一个数组。数组引用本身是不变的,但数组的内容仍然是可变的。如果它工作正常,这是一个无用的示例,这可能是重复的吗?@cfrozendath我只是添加了无用的,因为StringBuilder的内容没有返回使用或其他什么。