Pourquoi avons-nous besoin de EventArgs si nous passons object lui-même? C #

Je suis encore nouveau sur C # et sur la programmation. J’ai déjà utilisé WPF et cherché l’une des pratiques de socket. Et je ne comprends pas la raison du second argument existant dans eventHandlers.

J’essaie de créer un serveur asynchrone. Mais dans la vidéo, le programmeur a ajouté des eventArgs personnalisés à l’object lui-même et les a également ajoutés à eventHandler. Pour rendre les choses un peu plus claires, il y a la partie du code:

Tampon pour la classe de données reçue

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()... } 

Classe 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 DataReceived; // Event Invokers protected virtual void OnDisconnected() { Disconnected?.Invoke(this, EventArgs.Empty); } protected virtual void OnDataReceived(DataReceivedEventArgs e) { DataReceived?.Invoke(this, e); } } 

Donc mes questions sont:

1. Pourquoi avez-vous besoin de passer la même chose deux fois?

et

2. Pourquoi auriez-vous besoin d’avoir eventArgs si vous pouvez tout stocker dans l’object et changer de classe d’object uniquement sans rupture de code si vous devez append de nouveaux arguments?

Vous ne passez pas deux fois la même chose; le premier paramètre est l’object qui a déclenché l’événement, les deuxièmes détails concernant l’événement.

Une des raisons pour lesquelles il est conseillé de placer des détails à l’intérieur d’un object événement au lieu de simplement mettre à jour l’object émetteur est que vous ne savez pas à quel moment le gestionnaire d’événements va agir sur l’événement. Si vous venez de stocker les détails de l’événement dans l’object émetteur, vous introduisez des conditions de course potentielles. De plus, cela violerait le principe de la responsabilité unique et confondrait deux préoccupations différentes.

En outre, dans cet exemple, la classe n’est pas ajoutée à deux endroits; le code client a simplement une référence à une instance d’événement , le serveur la définition de la classe d’événement .