C# – Cơ bản Delegate

Delegate là một kiến thức căn bản cần nắm vững khi bạn nhập môn C#, .NET. Mặc dù bạn có thể cho rằng delegate không cần thiết và tránh sử dụng nó (một cách trực tiếp) nhưng cuối cùng bạn vẫn phải nhận thấy rằng: mình không thể “sống” khi thiếu delegate. Delegate không khó hiểu cũng như không khó để áp dụng, nếu bạn dành một chút thời gian nghiên cứu.

ất kì phương thức nào, miễn là nó phù hợp (kiểu trả về, tham số). Là một “đại sứ”, delegate có thể triệu gọi phương thức bất kì nơi nào: từ đối tượng này đến đối tượng kia, từ thread này sang thread kia,… Đây là đặc điểm chính của delegate, bạn sẽ cần nhớ lại điều này khi giải quyết các vấn đề thường gặp như truyền dữ liệu giữa hai Form, xử lý lỗi “Cross-thread operation not valid”, tạo event, …

Ngoài ra, bởi vì là một đối tượng, delegate có thể được truyền vào làm tham số của các phương thức. Bạn có thể hiểu đơn giản: delegate là một đối tượng dùng để bao đóng một hoặc nhiều phương thức (Multicast), hay có thể coi delegate là một sự kết hợp giữa đối tượng và phương thức.

Ta sẽ học cách sử dụng delegate qua 3 bước:

  •  Khai báo
  •  Khởi tạo
  • Thực thi

Khai báo

Là một đại diện của phương thức và là một kiểu dữ liệu, cách khai báo delegate giống như một sự kết hợp giữa khai báo đối tượng và phương thức. Một delegate được khai báo theo cú pháp sau:

[modifier] delegate return-type Identifier ([formal-parameters])

Trong đó:

  • modifier: phạm vi truy xuất (public, private, protected, internal)
  • delegate: từ khóa
  • return-type: kiểu dữ liệu trả về
  • Identifier: định danh của delegate
  • formal-parameters: danh sách các tham số hình thức

Các phần trong cặp ngoặc vuông [] là tùy chọn.

Ví dụ:

public delegate int DoSomething(int x, int y)

Khai báo một delegate có tên DoSomething, bạn có thể dùng delegate này đại diện cho bất kì phương thức nào yêu cầu hai tham số kiểu int và trả về kiểu int.

Khởi tạo

Giả sử  ta có một phương thức sau, có kiểu trả về và tham số tương ứng với delegate DoSomething trên:

int Add(int x,int y)
{
return x+y;
}

Khởi tạo delegate từ một phương thức có sẵn, bạn cần truyền phương thức mà delegate sẽ đại diện vào trong constructor. Bạn có thể khởi tạo delegate theo một trong hai cách sau. Chúng tương đương nhau khi được biên dịch:

// cách 1
DoSomething myDelegate = new DoSomething(Add)

// cách 2
DoSomething myDelegate = Add;

Hoặc sử dụng tên đầy đủ của phương thức:

DoSomething obj = MyNamespace1.Program.Add;

Thay vì tạo phương thức Add() trên, bạn có thể sử dụng anonymous method hoặc lambda expression để tạo đối tượng:

// anonymous method
DoSomething obj = delegate(int x,int y){
return x+y;
};

// lambda expression
DoSomething obj = (x,y) => x+y;

Thực thi

Có hai cách để bạn thực thi delegate.

Coi delegate như một phương thức:

myDelegate(a, b)

và như một đối tượng, bằng cách gọi phương thức Invoke():

myDelegate.Invoke(a, b)

Ví dụ

class Program
{
    public delegate int DoSomething(int x,int y);

    public static void Main(string[] args)
    {
        Math m=new Math();
        DoSomething obj = (x,y)=>x+y;

        int value=obj(3,4);

        Console.WriteLine(value); // output: 7
        Console.ReadKey();
    }
}

Tiếp theo là gì?

Một series hướng dẫn khá đầy đủ về delegate và event trên codeproject, bao gồm cả multicast delegate: