2016-06-19 78 views
1

我还是C#和编程的新手。我已经使用了WPF并寻找了一个socket实践。我只是没有得到eventHandlers中存在的第二个参数的原因。如果我们传递对象本身,为什么我们需要EventArgs? C#

我试图做一个异步服务器。但是在视频中,程序员已经将自定义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()... 
} 

Client类

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.为什么你需要有EventArgs的,如果你能在对象存储一切信息并更改对象类唯一没有密码破译,如果需要添加新的ARGS?

回答

3

你不是通过同样的事情两次;第一个参数是引发事件的对象,即事件的第二个细节。

一个原因是把细节事件对象的内部,而不是仅仅更新发送对象是个好主意,因为你不知道在什么时候该事件处理是要对事件采取行动;如果您只将事件详细信息存储在发件人对象中,那么您正在引入潜在的竞争条件。另外,它会违反单一责任原则并混淆两个不同的问题。

同样,样品中,类不被在两个地方加入;客户端代码只是有一个事件实例参考,服务器事件类的定义。

+0

好耶,这让更多的现在感觉到了一点,但如果我再丢失了,我会再回到这个问题。无论如何,帮助Thx :) –

相关问题