Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#字节数组受无引用方法的影响_C#_Sockets - Fatal编程技术网

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的内容没有返回使用或其他什么。