23 Delegate

Delegate trong C# là một kiểu dữ liệu đặc biệt cho phép bạn lưu trữ và gọi các phương thức thông qua biến. Nó được xem như một “hàm ủy quyền” hoặc một “con trỏ hàm” trong C#. Delegate mang đến sự linh hoạt trong việc gọi các phương thức và hỗ trợ mạnh mẽ lập trình hướng sự kiện.

1. Khái niệm về Delegate

  • Delegate là một kiểu tham chiếu (reference type), dùng để đại diện cho một hoặc nhiều phương thức có cùng kiểu trả về và danh sách tham số.
  • Delegate cho phép bạn:
    • Gọi các phương thức một cách linh hoạt.
    • Truyền các phương thức như một tham số cho các phương thức khác.

Cú pháp khai báo:

delegate kiểu_trả_về TênDelegate(danh_sách_tham_số);

Ví dụ:

delegate void Notify(string message); // Khai báo delegate

void ShowMessage(string message)
{
    Console.WriteLine(message);
}

2. Tạo và sử dụng Delegate

Khai báo, khởi tạo và gọi Delegate

  1. Khai báo Delegate:
    • Delegate được khai báo với một kiểu trả về và danh sách tham số cụ thể.
delegate int MathOperation(int a, int b); // Delegate cho các phép toán
  1. Khởi tạo Delegate:
    • Delegate được khởi tạo bằng cách tham chiếu đến một phương thức có cùng kiểu trả về và danh sách tham số.
int Add(int x, int y) => x + y;

MathOperation operation = Add; // Khởi tạo delegate
  1. Gọi phương thức qua Delegate:
    • Sử dụng biến delegate để gọi phương thức.
int result = operation(5, 3);
Console.WriteLine(result); // Output: 8

3. Delegate đa hướng (Multicast Delegate)

Delegate có thể tham chiếu đến nhiều phương thức cùng lúc. Điều này được thực hiện bằng cách sử dụng các toán tử +=-=.

Ví dụ:

delegate void Notify(string message);

void NotifyAdmin(string message)
{
    Console.WriteLine($"Admin: {message}");
}

void NotifyUser(string message)
{
    Console.WriteLine($"User: {message}");
}

Notify notify = NotifyAdmin;
notify += NotifyUser;

notify("System maintenance"); // Gọi cả hai phương thức

Kết quả:

Admin: System maintenance
User: System maintenance

4. Delegate ẩn danh (Anonymous Delegate)

Delegate ẩn danh cho phép bạn khai báo và sử dụng một phương thức trực tiếp mà không cần định nghĩa trước.

Ví dụ:

delegate int MathOperation(int a, int b);

MathOperation multiply = delegate (int a, int b)
{
    return a * b;
};

Console.WriteLine(multiply(4, 5)); // Output: 20

5. Sử dụng Delegate với Lambda Expressions

Lambda expressions là cách ngắn gọn để định nghĩa các phương thức và gán chúng cho Delegate.

Ví dụ:

delegate int MathOperation(int a, int b);

MathOperation subtract = (a, b) => a - b;

Console.WriteLine(subtract(10, 4)); // Output: 6

6. Delegate kết hợp với sự kiện (Event)

Delegate thường được sử dụng trong lập trình sự kiện để định nghĩa cách xử lý sự kiện.

Ví dụ:

delegate void NotifyEventHandler(string message);

class EventPublisher
{
    public event NotifyEventHandler NotifyEvent;

    public void TriggerEvent(string message)
    {
        NotifyEvent?.Invoke(message); // Gọi các phương thức được đăng ký
    }
}

class Program
{
    static void Main()
    {
        EventPublisher publisher = new EventPublisher();

        publisher.NotifyEvent += (msg) => Console.WriteLine($"Received: {msg}");

        publisher.TriggerEvent("Hello, World!");
    }
}

7. So sánh Delegate và Interface

Tiêu chíDelegateInterface
Cách sử dụngĐại diện cho một hoặc nhiều phương thức.Định nghĩa các hành vi mà lớp phải triển khai.
Tính linh hoạtCó thể thay đổi phương thức tại runtime.Gắn chặt vào cấu trúc lớp tại compile-time.
Phạm vi ứng dụngPhù hợp cho lập trình sự kiện hoặc callback.Dùng để xây dựng hệ thống phân cấp lớp.

Khi nào nên sử dụng Delegate?

  1. Khi cần truyền phương thức như một tham số.
  2. Khi cần thực hiện các callback.
  3. Khi xử lý các sự kiện.
  4. Khi cần đại diện cho một nhóm phương thức.

Để lại một bình luận 0

Your email address will not be published. Required fields are marked *