如果我们传递对象本身,为什么我们需要EventArgs? C#

时间:2016-06-19 00:01:09

标签: c# wpf sockets events server

我还是C#和编程新手。我已经使用过WPF并寻找其中一种套接字实践。我只是没有得到eventHandlers中现有第二个参数的原因。

我正在尝试制作异步服务器。但是在视频中程序员已经将自定义eventArgs添加到对象本身并将它们添加到eventHandler中。为了使事情更清楚,代码的一部分是:

接收数据类的缓冲区

class DataReceivedEventArgs : EventArgs
{
    public const int BufferSize = 1024;
    public byte[] BufferBytes;
    public int ToReceive;
    public MemoryStream BufferStream;

    // Constructor for this
    public DataReceivedEventArgs(int toReceive)...

    // Dispose function for this
    public void Dispose()...

    // Close function for stream
    private void Close()...
}

客户端类

class Client
{
    private byte[] lenBufferBytes;
    private DataReceivedEventArgs receiveBuffer;
    private Socket socket;
    public IPEndPoint EndPoint...

    // Constructor for this
    public Client(Socket socket)
    {
        this.socket = socket;
        this.lenBufferBytes = new byte[4];
    }

    // Events
    public event EventHandler Disconnected;
    public event EventHandler<DataReceivedEventArgs> DataReceived;

    // Event Invokers
    protected virtual void OnDisconnected()
    {
        Disconnected?.Invoke(this, EventArgs.Empty);
    }

    protected virtual void OnDataReceived(DataReceivedEventArgs e)
    {
        DataReceived?.Invoke(this, e);
    }


}

所以我的问题是:

1。为什么你需要两次传递相同的东西?

2。如果你可以在对象中存储所有内容并且只是在没有代码破坏的情况下更改对象类,如果需要添加新的args,为什么你需要有eventArgs?

1 个答案:

答案 0 :(得分:3)

你没有两次传递同样的东西;第一个参数是引发事件的对象,第二个是有关事件的详细信息。

将细节放在事件对象中而不仅仅是更新发送者对象是个好主意的一个原因是因为你不知道事件处理程序将在什么时候对事件起作用;如果您只是将事件详细信息存储在发件人对象中,那么您将引入潜在的竞争条件。此外,它会违反单一责任原则并混淆两个不同的问题。

此外,在该样本中,该课程没有在两个地方添加;客户端代码只引用事件实例,服务器引用事件类