Lập trình sự kiện trong C# – Phần 9
1. Sự kiện trong C# là gì?
Sự kiện (Event) là cơ chế cho phép một đối tượng thông báo đến các đối tượng khác khi có sự thay đổi hoặc hành động xảy ra.
💡 Ví dụ thực tế:
- Khi bạn bấm nút trên giao diện, một sự kiện Click được kích hoạt.
- Khi nhập sai dữ liệu, một sự kiện ValidationError có thể xảy ra.
2. Delegate trong sự kiện
Sự kiện trong C# hoạt động dựa trên Delegate.
- Delegate là một kiểu dữ liệu dùng để chứa tham chiếu đến phương thức.
- Sự kiện trong C# sử dụng Delegate để gọi các phương thức được đăng ký.
Ví dụ về Delegate:
public delegate void Notify(); // Khai báo delegate
class Process
{
public Notify EventHandler; // Biến delegate
public void Start()
{
Console.WriteLine("Quá trình đang chạy...");
EventHandler?.Invoke(); // Gọi sự kiện
}
}
class Program
{
static void EventMessage()
{
Console.WriteLine("Sự kiện được kích hoạt!");
}
static void Main()
{
Process process = new Process();
process.EventHandler = EventMessage; // Đăng ký sự kiện
process.Start();
}
}
⏳ Kết quả:
Quá trình đang chạy...
Sự kiện được kích hoạt!
3. Khai báo sự kiện với event
Trong C#, sự kiện được khai báo bằng từ khóa event để đảm bảo tính an toàn hơn so với Delegate trực tiếp.
public delegate void Notify();
class Process
{
public event Notify EventHandler; // Khai báo sự kiện
public void Start()
{
Console.WriteLine("Quá trình bắt đầu...");
EventHandler?.Invoke(); // Kích hoạt sự kiện
}
}
class Program
{
static void ShowMessage()
{
Console.WriteLine("Sự kiện xảy ra!");
}
static void Main()
{
Process process = new Process();
process.EventHandler += ShowMessage; // Đăng ký sự kiện
process.Start();
}
}
⏳ Kết quả:
Quá trình bắt đầu...
Sự kiện xảy ra!
📌 Lưu ý:
eventgiúp bảo vệ sự kiện khỏi bị thay đổi từ bên ngoài lớp.- Bạn chỉ có thể đăng ký (
+=) hoặc hủy đăng ký (-=) sự kiện.
4. Đăng ký nhiều phương thức cho một sự kiện
Một sự kiện có thể có nhiều phương thức cùng lắng nghe.
class Process
{
public event Action EventHandler;
public void Start()
{
Console.WriteLine("Quá trình đang chạy...");
EventHandler?.Invoke(); // Gọi tất cả phương thức đăng ký
}
}
class Program
{
static void ShowMessage1()
{
Console.WriteLine("Sự kiện 1 được kích hoạt!");
}
static void ShowMessage2()
{
Console.WriteLine("Sự kiện 2 được kích hoạt!");
}
static void Main()
{
Process process = new Process();
process.EventHandler += ShowMessage1;
process.EventHandler += ShowMessage2;
process.Start();
}
}
⏳ Kết quả:
Quá trình đang chạy...
Sự kiện 1 được kích hoạt!
Sự kiện 2 được kích hoạt!
5. Hủy đăng ký sự kiện
Sử dụng -= để hủy đăng ký một phương thức khỏi sự kiện.
process.EventHandler -= ShowMessage2;
Sau khi hủy ShowMessage2, chỉ còn ShowMessage1 được gọi khi sự kiện xảy ra.
6. Truyền tham số cho sự kiện
Bạn có thể truyền dữ liệu khi sự kiện xảy ra bằng cách sử dụng EventHandler<T>.
public class ProcessEventArgs : EventArgs
{
public string Message { get; }
public ProcessEventArgs(string message) { Message = message; }
}
class Process
{
public event EventHandler<ProcessEventArgs> EventHandler;
public void Start()
{
Console.WriteLine("Quá trình bắt đầu...");
EventHandler?.Invoke(this, new ProcessEventArgs("Sự kiện đã xảy ra!"));
}
}
class Program
{
static void ShowMessage(object sender, ProcessEventArgs e)
{
Console.WriteLine(e.Message);
}
static void Main()
{
Process process = new Process();
process.EventHandler += ShowMessage;
process.Start();
}
}
⏳ Kết quả:
Quá trình bắt đầu...
Sự kiện đã xảy ra!
📌 Lợi ích của EventArgs:
- Dễ dàng truyền nhiều thông tin hơn (ví dụ: thời gian, trạng thái).
- Giữ mã nguồn sạch và dễ mở rộng.
7. Tóm tắt bài học
✅ Sự kiện trong C# giúp một đối tượng thông báo cho đối tượng khác khi có thay đổi.
✅ Sử dụng Delegate để định nghĩa sự kiện.
✅ Dùng từ khóa event để khai báo sự kiện an toàn.
✅ Có thể đăng ký nhiều phương thức vào một sự kiện.
✅ Sử dụng EventArgs để truyền dữ liệu qua sự kiện.
💡 Bài tiếp theo:
👉 Lập trình đa luồng trong C# – Phần 10 🚀