C# - C Sharp: Event

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Trong C#, Event (Sự kiện) cho phép một đối tượng (nguồn của sự kiện) đưa ra thông báo cho những đối tượng khác - những đối tượng đăng ký sự kiện - về sự kiện (xảy ra một sự thay đổi nào đó).

Đặc điểm của Event

Mỗi sự kiện là một hành động được tạo ra bởi người dùng hoặc hệ thống và hành động này cho phép những đối tượng được yêu cầu sẽ thông báo tới những đối tượng hay những lớp khác việc xử lý sự kiện. Các sự kiện trong C# có những đặc điểm sau:

- Có thể được khai báo trong các lớp hoặc interface.

- Có thể được khai báo là abstract hoặc sealed.

- Có thể được khai báo là virtual.

- Được thực thi thông qua việc sử dụng delegate.

Sự kiện có thể được sử dụng để thực hiện các hành động tuỳ chỉnh dù không được sự hỗ trợ của C#. Sự kiện cũng hay được sử dụng để tạo các ứng dụng giao diện người dùng đồ họa (GUI), trong đó các sự kiện có thể xảy ra như chọn một mục trong danh sách (list), hoặc đóng cửa sổ theo dõi.

Tạo và sử dụng Event

Có bốn bước để thực thi các sự kiện trong C#, bao gồm:

  1. Định nghĩa một public delegate cho sự kiện
  2. Tạo sự kiện thông qua delegate
  3. Đăng ký để lắng nghe và xử lý sự kiện
  4. Kích hoạt sự kiện.

Các sự kiện sẽ sử dụng delegate để gọi các phương thức của các đối tượng đã đăng ký sự kiện. Khi một sự kiện nào đó (chứa các đăng ký) được kích hoạt thì các delegate liên quan sẽ được gọi tới.

Khai báo sự kiện

Để khai báo một sự kiện ta cần hai bước gồm khai báo delegate rồi sau đó mới khai báo sự kiện. Delegate sẽ truyền các tham số của phương thức thích hợp tới nơi gọi khi sự kiện được tạo, phương thức này gọi là bộ xử lý sự kiện. Sự kiện được khai báo bằng cách sử dụng từ khoá event và ngay sau là tên của delegate, và sau khi khai báo xong thì sự kiện sẽ được liên kết với delegate.

Cú pháp:

Khai báo delegate:
Bổ_từ_truy_cập delegate Kiểu_trả_về Tên_delegate(Danh_sách_tham_số);
Khai báo sự kiện:
Bổ_từ_truy_cập event Tên_delegate Tên_sự_kiện;

Ví dụ:

using System;
public delegate void PrintDetails(); //khai báo delegate trước
class TestEvent
{
  event PrintDetails Print; //rồi khai báo event
}

Đăng ký và huỷ đăng ký sự kiện

Đối tượng chỉ có thể đăng ký sự kiện khi sự kiện tồn tại, và để đăng ký sự kiện thì đối tượng sẽ thêm một delegate để gọi phương thức khi sự kiện được kích hoạt. Điều này được thực hiện bằng cách liên kết bộ xử lý sự kiện với sự kiện đã được tạo, liên kết được thực hiện bằng toán tử '+='. Thao tác như vậy gọi là đăng ký sự kiện.

Để huỷ bỏ đăng ký một sự kiện nào đó, ta sử dụng toán tử '-='.

Cú pháp:

Đăng ký sự kiện:

Tên_đối_tượng.Tên_sự_kiện += new Tên_delegate(Tên_phương_thức);

Huỷ đăng ký sự kiện:

Tên_đối_tượng.Tên_sự_kiện -= new Tên_delegate(Tên_phương_thức);

Ví dụ:

using System;
public delegate void PrintDetails();
class TestEvent
{
  event PrintDetails Print;
  void Show()
  {
    Console.WriteLine("Show me to the Console");
  }
  static void Main(string[] args)
  {
    TestEvent objTestEvent = new TestEvent();
    objTestEvent.Print += new PrintDetails(objTestEvent.Show); //câu lệnh đăng ký sự kiện
  }
}

Kích hoạt sự kiện

Khi một sự kiện được kích hoạt nó sẽ thông báo tới tất cả các đối tượng đã đăng ký nó; việc kích hoạt một sự kiện có thể là tác nhân người dùng hoặc hệ thống. Sau khi sự kiện đã được kích hoạt thì tất cả các bộ xử lý sự kiện liên quan sẽ được thực thi, khi đó delegate sẽ gọi tất cả các bộ xử lý đã được thêm vào sự kiện. Bạn hãy đảm bảo rằng trước khi sự kiện được kích hoạt thì nó phải được liên kết với các bộ xử lý sự kiện thích hợp, nếu không sự kiện sẽ được coi là null.

Cú pháp:

Tên_đối_tượng.Tên_sự_kiện(Danh_sách_tham_số);

Ví dụ:

using System;
public delegate void PrintDetails();
class TestEvent
{
  event PrintDetails Print;
  void Show()
  {
    Console.WriteLine("Hay hien thi toi ra man hinh.");
  }
  static void Main(string[] args)
  {
    TestEvent objTestEvent = new TestEvent();
    objTestEvent.Print += new PrintDetails(objTestEvent.Show);
    objTestEvent.Print(); //câu lệnh kích hoạt sự kiện
  }
}

Sự kiện và thừa kế

Một sự kiện trong C# chỉ có thể được gọi trong lớp chứa sự kiện đó, như vậy có nghĩa lớp dẫn xuất sẽ không thể gọi trực tiếp sự kiện. Tuy nhiên, sự kiện lại có thể được gọi gián tiếp bằng cách tạo một phương thức có bổ từ truy cập không phải là private trong lớp cơ sở. Ví dụ:

using System;
public delegate void Display(string msg);
public class Parent
{
  event Display Print;
  protected void InvokeMethod() //phương thức nơi đăng ký sự kiện
  {
    Print += new Display(PrintMessage);
    Check();
  }
  void Check()
  {
    if (Print != null)
    {
      PrintMessage("Su kien co the duoc goi truc tiep bang cach tao mot phuong thuc protected.");
    }
  }
  void PrintMessage(string msg)
  {
    Console.WriteLine(msg);
  }
}
class Child : Parent
{
  static void Main(string[] args)
  {
    Child objChild = new Child();
    objChild.InvokeMethod();
  }
}

Lưu ý

- Mỗi sự kiện chỉ có thể được khai báo là abstract ở trong lớp abstract, và vì vậy sự kiện phải được override trong lớp dẫn xuất của lớp abstract. Các sự kiện abstract được dùng với mục đích có thể được tuỳ chỉnh trong các lớp dẫn xuất.

- Một sự kiện được khai báo là sealed trong lớp cơ sở để ngăn chặn việc lớp dẫn xuất gọi nó. Sự kiện sealed không thể được override trong bất kỳ lớp dẫn xuất nào của lớp cơ sở; điều này sẽ đảm bảo sự an toàn cho sự kiện khi nó hoạt động.

» Tiếp: Collection
« Trước: Delegate
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!