Uncategorized

Delegate trong C#

Trong lúc đợi Visual Studio update một số tính năng mới, mình viết 1 số kiến thức về delagate trong C# cho các bạn còn rối trong vấn đề này.

Một delegate giống như một “người đại diện” hay “đại sứ”. Một delegate có thể được dùng để tạo một bao đóng (encapsulation) cho bấ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ụ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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();
        }
    }
Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s