Làm việc với Delegate
Giới thiệu Delegate
Các Delegate trong C# tương tự như các con trỏ tới các hàm trong C hay C++. Một delegate là một biến kiểu tham chiếu chứa tham chiếu tới một phương thức. Tham chiếu có thể được thay đổi khi chạy.
Các delegate đặc biệt được sử dụng để thực hiện Event và các phương thức call-back. Tất cả các delegate được ngầm xuất phát từ lớp System.Delegate.
Khai báo Delegate
Khai báo delegate xác định các phương thức tham chiếu bởi các delegate. Một delegate có thể tham chiếu tới các phương thức có khai báo giống với phương thức đó.
Ví dụ, hãy xem xét một delegate
public delegate int MyDelegate(string s);
Delegate trên có thể được sử dụng để tham chiếu tới bất kỳ phương thức có một tham số đầu vào là string và trả về một giá trị int.
Cú pháp:
delegate <return type> <delegate-name> <parameter list>
Khởi tạo Delegate
Mỗi lần kiểu delegate được khai báo, một đối tượng delegate được tạo ra thông qua từ khoá new
và sau đó sẽ thi hành với một phương thức cụ thể. Khi tạo ra delegate, đối số truyền vào qua biểu thức new
được viết giống như lời gọi phương thức nhưng không có tham số cho phương thức đó. Ví dụ:
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile);
Tiếp theo sẽ là ví dụ minh hoạ khai báo khởi tạo và sử dụng delegate tham chiếu tới phương thức có một tham số int và trả về một giá trị int:
Multicasting Delegate
Bạn có thể cộng (+) hai đối tượng delegate để tạo thành một delegate mới. Chỉ có các delegate cùng kiểu mới cộng thêm như vậy. Và khi đó ta thực thi chạy delegate thì nó sẽ chạy toàn bộ các cộng dồn delegate tham chiếu. Ngược lại, sẽ trừ bớt tham chiếu delegate thông quan toán tử "-".
Sử dụng đặc tính này của delegate giúp bạn có thể tạo ra một lời gọi tới nhiều phương thức. Như vậy thông qua gọi một delegate thì nhiều phương thức có thể thi hành. Việc này gọi là multicasting của một delegate.
Ví dụ MulticastingDelegateDemo sẽ minh hoạ chi tiết về khái niệm trên:
Sử dụng Delegate với các nghiệp vụ khác
Ví dụ sau sẽ minh hoạ sử dụng delegate trong nghiệp vụ File I/O. Cụ thể delegate PrintString
có thể được sử dụng để tham chiếu tới một phương thức cần một tham số đầu vào string và kiểu trả về là void.
Trong ví dụ IODelegateDemo sau đây, chúng ta sẽ sử dụng delegate này cho hai lần gọi tới hai phương thức khác nhau; một để in một xâu ký tự, một để in nội dung của nó từ file: