これは、非同期ソケットを使用してデータを受信するための有効な(役に立たない)例です。 完全なコードはMSDNです。 BeginReceive
メソッド内C#バイト配列が影響を受けるthrou参照のないメソッド
public class Class1
{
private static void Receive(Socket client)
{
StateObject state = new StateObject();
state.workSocket = client;
//state.buffer is a empty byte array
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
private static void ReceiveCallback(IAsyncResult ar)
{
StateObject state = (StateObject) ar.AsyncState;
Socket client = state.workSocket;
int bytesRead = client.EndReceive(ar);
//state.buffer contains now all the received data.
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead);
}
}
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = 256;
public byte[] buffer = new byte[BufferSize];
public StringBuilder sb = new StringBuilder();
}
何のref
またはout
キーワードが存在しないためstate.buffer
フィールドに影響を与えることは不可能である必要があります。
しかし、バイト配列は実際には変更された値を持っています。
state.buffer
フィールドが空であり、Receive
メソッドではどのようにして、ReceiveCallback
メソッドでアクセスすると受信したすべてのデータが含まれるのでしょうか?あなたは時間がかかった場合、少なくともは、あなたが投稿MSDNリンク上コメントを読むために
この場合、 'buffer'は配列です。配列参照自体は変更されていませんが、配列の* contents *は変更可能です。 – Eris
[Passing By refとout]の重複している可能性があります(http://stackoverflow.com/questions/1644372/passing-by-ref-and-out) – Eris
正しく動作する場合、どのように役に立たない例ですか? –