C# 返回EventArgs中修改的字节[]缓冲区

C# 返回EventArgs中修改的字节[]缓冲区,c#,arrays,arguments,eventargs,C#,Arrays,Arguments,Eventargs,我想让我的事件消费者能够通过EventArgs修改缓冲区,但我无法正确锁定解决方案。我对C/C++有很好的准备,但对C#缺乏经验 我的事件定义是: public class ResponseEventArgs : EventArgs { public byte[] Buffer { get; set; } public ResponseEventArgs(byte[] buffer) { this.Buffer = buffer; } } p

我想让我的事件消费者能够通过
EventArgs
修改缓冲区,但我无法正确锁定解决方案。我对C/C++有很好的准备,但对C#缺乏经验

我的事件定义是:

public class ResponseEventArgs : EventArgs
{
    public byte[] Buffer { get; set;  }

    public ResponseEventArgs(byte[] buffer)
    {
        this.Buffer = buffer;
    }
}

public delegate void ResponseEventHandler(object sender, ResponseEventArgs e);
public event ResponseEventHandler Response;
我提出这项活动:

 byte[] buffer = new byte[BUFSIZE];

 Response(this, new ResponseEventArgs(buffer));
一个示例事件处理程序,其中我将转换为UTF8、replace并返回到字节,例如:

void Response_Test(object sender, ResponseEventArgs e)
{      
    string stringBuf = System.Text.Encoding.UTF8.GetString(e.Buffer);

    stringBuf = stringBuf.Replace("A", "B");

    e.Buffer = new byte[stringBuf.Length * sizeof(char)];
    System.Buffer.BlockCopy(stringBuf.ToCharArray(), 0, e.Buffer, 0, 
                            e.Buffer.Length);        
}

从事件返回时,字节缓冲区仍保留旧内容

事件发生后,您需要检查
响应eventargs.Buffer
,而不是本地
Buffer
。原因是,您的事件处理程序正在ResponseEventArgs内创建一个新缓冲区并修改该缓冲区,而不是在事件调用之前创建的原始缓冲区。要获取新的缓冲区,您必须直接从
响应eventargs
获取引用

这里有一个正确的方法:

byte[] buffer = new byte[BUFSIZE];

//create the event args separately so we can reference it after the raise event call.
var args = new ResponseEventArgs(buffer);

Response(this, args);  //Raise the event

//get the current/new buffer from the event args
var modifiedBuffer = args.Buffer;

就这样,我今天有点心烦意乱。非常感谢。如果要替换缓冲区,我们为什么要在开始时分配它?@AlexD不知道。。。为了简单起见,我假设Op删除了实际填充原始缓冲区的代码。@AlexD您不必这样做,这完全取决于
ResponseEvent
的合同,以及订户是否需要预先提供数组。@NathanA我当然可能错了,但我的理解是OP的最初想法是分配缓冲区,然后让处理程序填充它(在C++中非常常见)。您提出了一种更优雅的方法,完全消除了预分配的需要。