.NET basado en eventos:cómo agregar un evento a una clase

 C Programming >> Programación C >  >> Tags >> .NET
.NET basado en eventos:cómo agregar un evento a una clase

En el artículo anterior vimos cómo funcionan los eventos. En este artículo, mostraré cómo agregar un evento a una clase. Para ilustrar esto, he creado una aplicación de chat simple que usa una cola de mensajes en memoria. Cada ventana de chat está suscrita al evento OnMessageReceived de la cola de mensajes y actualiza su interfaz de usuario al recibir un mensaje.

1:agregar un tipo de delegado, agregar un evento a una clase y disparar el evento

  1. Declarar el tipo de delegado el tipo de delegado se declara por sí solo, no es parte de una clase.
  2. Añadir el evento – usa el tipo de delegado que acabas de crear
  3. Activar el evento – El evento será nulo si no hay suscriptores, por lo que siempre debe realizar una verificación nula.
public delegate void MessageReceivedEventHandler(Message message); 
//1. declare the delegate type for the event

public class MessageQueue
{
	public event MessageReceivedEventHandler OnMessageReceived; 
//2. Add the event with the delegate type you declared 

	public void Enqueue(Message message)
	{
		OnMessageReceived?.Invoke(message); //3. fire the event
	}
}
Code language: C# (cs)

2 – Suscríbete al evento

Hay dos partes para suscribirse a un evento:

  • Suscríbase usando la sintaxis:evento +=método con la misma firma que el delegado
  • Cancelar suscripción usando la sintaxis:evento -=método con la misma firma que el delegado
public partial class frmChat : Form
{
	private readonly MessageQueue MessageQueue;
	private readonly Guid UserId;
	public frmChat(MessageQueue messageQueue)
	{
		InitializeComponent();

		UserId = Guid.NewGuid();

		this.MessageQueue = messageQueue;
                //1. subscribe
		this.MessageQueue.OnMessageReceived += MessageQueue_OnMessageReceived; 
	}

	private void MessageQueue_OnMessageReceived(Message message)
	{
		txtChatWindow.AppendText($"{message.Time}\t{message.UserName}\t{message.Msg}\n");
	}

	private void btnSubmit_Click(object sender, EventArgs e)
	{
		MessageQueue.Enqueue(new Message(UserId, txtMessage.Text, txtName.Text));
	}

	private void frmChat_FormClosing(object sender, FormClosingEventArgs e)
	{
                //2. unsubscribe 
		MessageQueue.OnMessageReceived -= MessageQueue_OnMessageReceived; 
	}
}
Code language: C# (cs)