Search…

Delegates và Events trong C#

26/09/20203 min read
Giới thiệu và hướng dẫn sử dụng Event và Delegate trong C#.

Trong C#, event delegate cho phép tạo ra các sự kiện và những callback, từ đó rất hữu ích cho mô hình sự kiện và khả năng mở rộng ứng dụng.

Field và Property trong C#

private int m_Bullet;    // Field

public int Bullet        // Property
{
    get { return m_Bullet; }
    set { m_Bullet = value; }
}

Trong phần ghi chú, Field trong C# là 1 thuộc tính, còn Property giống một phương thức hơn. Trong ví dụ trên thì Property có 2 khối lệnh dùng để lấy hoặc gán giá trị cho Field m_Bullet và đây cũng là chức năng thường được sử dụng của Property. Ngoài ra, Property cũng có thể được khai báo như sau:

public int Bullet
{
    get;
    set;
}

Với kiểu khai báo này có thể thấy Property này không liên quan đến Field nào cả, tuy nhiên với cách khai báo này thì trình biên dịch sẽ tự động tạo ra 1 Field vô danh mang thuộc tính private và chỉ có thể truy xuất thông qua Property Bullet trên.

Tóm tắt thì Property giúp tạo ra các getter và setter cho các thuộc tính (Field) mà không cần tạo ra các phương thức getter, setter cụ thể.

Delegate là gì?

Delegate là một kiểu dùng để mô tả phương thức, bao gồm có kiểu trả về và các tham số của phương thức, nó có khả năng gọi đến phương thức giống với cấu trúc hiện tại của nó.

class Test
{
    public delegate int DoSomethingWithNumbers(int param1, int param2);

    static int Sum(int x, int y)
    {
        return x + y;
    }

    static int Sub(int x, int y)
    {
        return x - y;
    }

    static int DoMath(int x, int y, DoSomethingWithNumbers z)
    {
        return z(x, y);
    }

    public static void Main()
    {
        Console.WriteLine(DoMath(2, 1, Sum).ToString());

        Console.WriteLine(DoMath(2, 1, Sub).ToString());
    }
}

Bản thân delegate chỉ là tham chiếu, được sử dụng để đại diện cho phương thức nào đó, chẳng hạn trong ví dụ trên thì delegate đại diện cho phương thức sumsub hoặc bất kỳ phương thức nào có dạng 2 tham số là int và kiểu trả về là int - int(int, int).

Delegate và Event

Delegate suy cho cùng nó vẫn là Field, vậy Property của nó như thế nào? Và đó chính là nguyên nhân mà event ra đời, thông thường để khai báo 1 event, sử dụng cú pháp sau:

private delegate int DoSomethingWithNumbers(int param1, int param2);
public event DoSomethingWithNumbers NumberEvent;

Delegate có tên là DoSomeThingWithNumbers và dùng nó để tạo một event có tên là NumberEvent. Nhìn vào đây có thể lầm tưởng rằng NumberEvent là 1 Field nhưng thực chất, nó sẽ hoạt động như sau:

private DoSomethingWithNumbers numberEvent;

public event DoSomethingWithNumbers NumberEvent
{
    add
    {
         this.numberEvent += value;
    }

    remove
    {
         this.numberEvent -= value;
    }
}

Event là một khối lệnh (gần giống với Property), khi khai báo như trên, nó sẽ tự động sinh ra một Field delegate, nhiệm vụ của khối lệnh add là thêm một phương thức vào delegate numberEvent còn nhiệm vụ của khối lệnh remove là remove phương thức ra khỏi delegate.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024