83
Mặc dù delegate cho phép gọi bất kì số phương thức gián tiếp, nhưng chúng ta phải gọi các delegate tường minh. Trong nhiều trường hợp, sẽ rất hữu ích nếu delegate chạy tựđộng khi có một cái gì đó đặc biệt xảy ra. Trong .Net cho phép chúng ta định nghĩa và bẫy các hành động đặc biệt và sắp xếp để gọi một delegate để quản lý tình huống. Nhiều lớp trong .NET đưa ra sự kiện. Hầu hết các điều khiển đặt trên form dùng sự
kiện cho phép chạy mã chương trình tương ứng như: khi người dùng nhấp chuột nào nút lệnh hay nhập gì đó trên một trường. Bạn có thểđịnh nghĩa riêng sự kiện.
Khai báo sự kiện
Bạn khai báo một sự kiện trong một lớp để nhắm đến một hành động là nguồn của sự
kiện. Nguồn sự kiện thường là một lớp quan sát môi trường và phát trinh sự kiện khi có một dấu hiệu đặc biệt xảy ra. Một sự kiện chứa danh sách các phương thức để gọi khi sự kiện được tạo.
Vì sự kiện thường được dùng với delegate nên kiểu của sự kiện phải là delegate và bắt
đầu với từ khóa event.
public delegate void BatCongTac(bool state);
public class CongTac
{
public event BatCongTac OnBatCongTac;
Trong ví dụ trên, sự kiện OnBatCongTac cung cấp một giao tiếp cho phép theo giỏi trạng thái của công tác để thực hiện thao tác tắt mở bóng đèn tương ứng. Một sự kiện quản lý riêng các delegate của nó và không cần quản lý thủ công biến delegate.
Gán một sự kiện
Giống delegate, sự kiện có thểđược gán với toán tử += .
c.OnBatCongTac += new BatCongTac(d.TrangThaiDen);
Bỏ gán sự kiện
Bạn có thể dùng toán tử -= để xóa phương thức từ tập hợp delegate bên trong.
Tạo một sự kiện
Một sự kiện có thểđược tạo giống delegate bằng cách gọi nó như là một phương thức. Khi bạn gọi một sự kiện, tất cả các delegate gắn với nó được gọi tuần tự. Ví dụ:
public class CongTac
{
public event BatCongTac OnBatCongTac;
public bool state;
public void KhiBatCongTac()
{
if(OnBatCongTac!=null)
{
84
state = state ? false: true;
} } }
Kiểm tra null là cần thiết vì trường sự kiện ngầm định là null và nó khác null khi ta thực hiện gán một phương thức dùng toán tử +=. Nếu bạn tạo một sự kiện null, bạn sẽ
có một ngoại lệ NullReferenceException. Chúng ta cũng phải truyền các tham số
tương ứng khi bạn tạo sự kiện ứng với các delegate đã định nghĩa. Ví dụ sử dụng sự kiện và ủy nhiệm:
using System;
using System.Collections.Generic; using System.Text;
using System.Windows.Forms; namespace SuDungDelegate {
public delegate void BatCongTac(bool state);
public class CongTac
{
public event BatCongTac OnBatCongTac;
public bool state;
public void KhiBatCongTac()
{
OnBatCongTac(state);
state = state ? false: true;
} }
public class BongDen
{
public void TrangThaiDen(bool state)
{
if (state)
Console.WriteLine("Den Sang"); else
Console.WriteLine("Den tat"); }
}
public class TV
{
public void TrangThaiTV(bool state)
85
if (state)
Console.WriteLine("Mo TV"); else
Console.WriteLine("Tat tivi"); }
}
class Program
{
static CongTac c = new CongTac();
static BongDen d = new BongDen();
static TV t = new TV();
static void Main(string []args)
{
c.OnBatCongTac += new BatCongTac(d.TrangThaiDen);
c.OnBatCongTac += new BatCongTac(d.TrangThaiDen);
c.KhiBatCongTac();
c.KhiBatCongTac();
} } }