STDIO
Tìm kiếm gần đây

    Nội dung

    Delegates và Events trong C#

    28/11/2014
    16/05/2016
    Delegates và Events trong C#
    Bài viết này sẽ phần nào giúp các bạn hiểu rõ về Event và Delegate.

    Giới thiệu

    Những lập trình viên khi mới bắt đầu làm việc với C# thường gặp rắc rối khi phân biệt hai thuật ngữ là event delegate. Và qua cách C# cho chúng ta khai báo event thường làm cho các bạn hiểu lầm về nó. Bài viết này sẽ phần nào giúp các bạn hiểu rõ về event delegate.

    Tiền đề bài viết

    Trong quá trình ban đầu làm việc với C#, tôi và các đồng nghiệp đã gặp rất nhiều khó khăn và thắc mắc với event delegate. Do đó, sau quá trình nghiên cứu và làm việc nhiều với C#, tôi tổng hợp mọi kiến thức của mình trong bài viết này nhằm giúp các lập trình viên giải quyết khó khăn khi tiếp xúc với event delegate.

    Đối tượng hướng đến

    Bài viết này dành cho những bạn lập trình viên đã từng làm việc nhiều với ngôn ngữ C#, có kinh nghiệm trong công việc lập trình và có kiến thức về lập trình hướng đối tượng.

    Field và Property trong C#

    Tôi có đoạn code sau

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

    Như các bạn cũng đã thấy trong phần ghi chú, Field trong C# là một biến, còn Property nó 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 mà người ta thường 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 thì chúng ta có thể thấy có vẻ 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 trên.

    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. Và 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ó. Ví dụ về delegate

    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());
        }
    }

    Cần phải chú ý rằng, bản thân delegate chỉ là tham chiếu. Và đượ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 sum sub hoặc bất kỳ phương thức nào có 2 tham số là int và kiểu trả về là int.

    Delegate và Event

    Như đã nói ở trên, delegate suy cho cùng nó vẫn chỉ là Field, vậy Propety 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 một event, chúng ta làm như sau:

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

    Tôi đã tạo 1 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 thì nhiều người có thể lầm tưởng rằng NumberEvent là 1 Field nhưng thực chất, nó sẽ hoạt động như thế này:

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

    Như các bạn có thể thấy, event là một khối lệnh (gần giống với Property), khi chúng ta 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. Như vậy, về bản chất thì delegate event hoàn toàn khác nhau.

    Thảo luận

    In order to comment you must be a STDIO Insider. Please sign up or log in to continue.

    Đăng nhập

    Bài viết liên quan

    Event Trong C#

    Event Trong C#

    Thông thường khi mới bắt đầu lập trình giao diện Windows From Application, Windows Phone, chúng ta thường xuyên tiếp xúc với những sự kiện như Click của Button, ...

    Nguyễn Nghĩa

    25/10/2015

    Interface Trong C#

    Interface Trong C#

    Giới thiệu về interface trong C#, ý nghĩa sử dụng, tính ứng dụng và cách thức sử dụng interface trong C#.

    Huỳnh Minh Tân

    03/10/2017

    While Và Do...While Trong C++

    While Và Do...While Trong C++

    Cấu trúc lặp là kiến thức nền tảng quan trong trong bất cứ ngôn ngữ lập trình nào. Ngoài cấu trúc for đã được giới thiệu và hướng dẫn ở bài viết trước, bài viết này sẽ ...

    Rye Nguyen

    29/07/2015

    Bản Chất Của Biến Trong C/C++

    Bản Chất Của Biến Trong C/C++

    Những ngày đầu được học và làm việc với các kiểu biến như int, float, char….Tôi luôn có những thắc mắc về:”Điều gì đang xảy ra bên trong biến int, char… khi ta cấp phát ...

    Trần Hữu Danh

    16/01/2015

    Đọc Ghi File Cơ Bản Trong C#

    Đọc Ghi File Cơ Bản Trong C#

    Hướng dẫn đọc và ghi file cơ bản sử dụng đối tượng File trong C#. Nhờ có các hàm hỗ trợ nên các thao tác đọc ghi dữ liệu trên file trong C# được thực hiện một cách nhanh ...

    Bùi Trung Hiếu

    07/04/2016

    Type-casting Trong C++

    Type-casting Trong C++

    Chuyển đổi kiểu dữ liệu (type-casting) là một kỹ năng quan trọng trong lập trình C/C++. Một số bài toán phức tạp không thể giải được do dữ liệu không tương thích, qua quá ...

    Rye Nguyen

    30/07/2015

    9 Tính Năng Quan Trọng Trong C++11

    9 Tính Năng Quan Trọng Trong C++11

    C++11 là một phiên bản cải tiến và nâng cấp từ C++98 (hay các bạn vẫn gọi là C++), với những tính năng mới tối ưu hơn, dễ sử dụng hơn, dễ quản lý bộ nhớ hơn, và khắc phục ...

    Lê Minh Tài

    13/08/2015

    Tư Duy Tối Ưu Hóa Trong Lập Trình Games - Phần 1: Codes Trong C/C++

    Tư Duy Tối Ưu Hóa Trong Lập Trình Games - Phần 1: Codes Trong C/C++

    Bài viết hướng tối ưu hóa trong lập trình với C++, tối ưu hóa lập trình C++ với games, bài viết hướng games bởi vì games đòi hỏi hiệu năng rất cao, và các games lớn thông ...

    La Kiến Vinh

    18/09/2014

    Struct Trong Lập Trình C Và Tư Duy Trừu Tượng Hoá

    Struct Trong Lập Trình C Và Tư Duy Trừu Tượng Hoá

    Struct là một khái niệm ra đời từ rất sớm trong lịch sử phát triển ngôn ngữ lập trình C. Việc sử dụng struct giúp hệ thống hoá các đối tượng, tránh tình trạng rời rạc và ...

    Rye Nguyen

    11/08/2015

    Phân Biệt Tham Chiếu và Con Trỏ trong C++

    Phân Biệt Tham Chiếu và Con Trỏ trong C++

    Phân biệt tham chiếu và con trỏ trong C++ theo phương pháp đơn giản.

    La Kiến Vinh

    17/09/2014

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020