Thẻ

, , , ,

Delegate là 1 kiểu trong .NET, có thể hiểu đơn giản nó giống với con trỏ hàm trong C++!
Delegate thường được sử dụng với cơ chế callback, là cơ chế giống event mà tại đó ta có thể subcribe (đăng ký) 1 hoặc nhiều cái method để có thể gọi nó lúc khác!
Delegate là phần cơ bản trong cơ chế event của C#!
(Vốn rất quen thuộc khi làm việc với giao diện, nếu các bạn để ý phần code tự sinh phía giao diện!)

Sau đây ta sẽ xét ví dụ cơ bản nhất về delegate trong C#.

Khai báo

namespace MyDelegate
{
    public delegate int PhepTinh2SoHang(int a, int b);

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Khi khai báo ta có 3 điểm chú ý sau đây:
– Delegate là 1 type, nó tương đương với class!
– Khai báo giống với một method, nhưng thêm từ khóa delegate phí trước kiểu trả về.
– Không chứa thân hàm!

Khai báo trên tức là mình đã tạo ra 1 kiểu dữ liệu mới, có khả năng trỏ tới các method có cái signature tương tự (tức là có danh sách tham số và kiểu trả về giống vậy!).

Sử dụng

Đầu tiên ta tạo một lớp mới để làm ví dụ!
Class này tên là Phép toán, ta sẽ định nghĩa các phép toán thông thường trong này:

public class PhepToan
{
    public static int Cong(int a, int b)
    {
        return a + b;
    }

    public static int BinhPhuong(int a)
    {
        return a * a;
    }

    public static int Tru(int a, int b)
    {
        return a - b;
    }
}

Sau đây ta sẽ sử dụng delegate để gọi các method của class trên!

class Program
{
    static void Main(string[] args)
    {
        PhepTinh2SoHang domath = new PhepTinh2SoHang(PhepToan.Cong);
        Console.WriteLine(domath(10, 10));
        domath = new PhepTinh2SoHang(PhepToan.Tru);
        Console.WriteLine(domath(10, 1));
        Console.ReadLine();
    }
}

Như vậy thay vì sử dụng tên hàm ta sử dụng đối tượng delegate mà ta mới tạo ra!

Ví dụ

Ở ví dụ tiếp theo ta sử dụng delegate như là 1 kiểu trong class!

class Test
{
    PhepTinh2SoHang phepToan;
    public Test(PhepTinh2SoHang method)
    {
        phepToan = method;
    }

    public int DoMath(int a, int b)
    {
        return phepToan(a, b);
    }
}

Sử dụng truyền 1 method vào như một biến bình thường!

Test t = new Test(PhepToan.Tru);
Console.WriteLine(t.DoMath(10, 10));
Advertisements