Delegate trong C#



Delegate trong C# là tương tự như con trỏ tới các hàm, trong C hoặc trong C++. Một Delegate là một biến kiểu tham chiếu mà giữ tham chiếu tới một phương thức. Tham chiếu đó có thể được thay đổi tại runtime.

Đặc biệt, các delegate được sử dụng để triển khai các sự kiện và các phương thức call-back. Tất cả delegate được kế thừa một cách ngầm định từ lớp System.Delegate trong C#.

Khai báo Delegate trong C#

Khai báo Delegate trong C# quyết định các phương thức mà có thể được tham chiếu bởi Delegate đó. Một Delegate có thể tham chiếu tới một phương thức, mà có cùng dấu hiệu như của Delegate đó.

Ví dụ, bạn xét một delegate sau đây:

public delegate int MyDelegate (string s);

Delegate trên có thể được sử dụng để tham chiếu bất kỳ phương thức mà có một tham số string đơn và trả về một biến kiểu int.

Cú pháp để khai báo delegate trong C# là:

delegate <kiểu_trả_về> <tên_delegate> <danh_sách_tham_số>

Khởi tạo Delegate trong C#

Khi một kiểu delegate được khai báo, một đối tượng delegate phải được tạo với từ khóa new và được liên kết với một phương thức cụ thể. Khi tạo một delegate, tham số được truyền tới biểu thức new được viết tương tự như một lời gọi phương thức, nhưng không có tham số tới phương thức đó. Ví dụ:

public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);

Ví dụ sau minh họa cách khai báo, khởi tạo và sử dụng một delegate mà có thể được sử dụng để tham chiếu các phương thức mà nhận một tham số integer và trả về một giá trị integer.

using System;

delegate int NumberChanger(int n);
namespace VietJackCsharp
{
    class TestCsharp
    {
        static int num = 10;
        public static int AddNum(int p)
        {
            num += p;
            return num;
        }

        public static int MultNum(int q)
        {
            num *= q;
            return num;
        }
        public static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Vi du minh hoa Delegate trong C#");
            Console.WriteLine("----------------------------------");

            //tao cac doi tuong delegate
            NumberChanger nc1 = new NumberChanger(AddNum);
            NumberChanger nc2 = new NumberChanger(MultNum);

            //goi cac phuong thuc boi su dung cac doi tuong delegate
            nc1(25);
            Console.WriteLine("Gia tri cua num la: {0}", getNum());
            nc2(5);
            Console.WriteLine("Gia tri cua num la: {0}", getNum());
            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Delegate trong C#
Quảng cáo

Multicast một Delegate trong C#

Các đối tượng Delegate có thể được hợp thành bởi sử dụng toán tử "+". Một delegate được hợp thành gọi hai Delegate mà nó được hợp thành từ đó. Chỉ có các delegate cùng kiểu có thể được hợp thành. Toán tử "-" có thể được sử dụng để gỡ bỏ một delegate thành phần từ một delegate được hợp thành.

Sử dụng thuộc tính này của các delegate, bạn có thể tạo một danh sách triệu hồi của các phương thức mà sẽ được gọi khi delegate đó được triệu hồi. Điều này được gọi là Multicasting của một Delegate. Chương trình ví dụ sau minh họa Multicasting của một Delegate trong C#:

using System;

delegate int NumberChanger(int n);
namespace VietJackCsharp
{
    class TestCsharp
    {
        static int num = 10;
        public static int AddNum(int p)
        {
            num += p;
            return num;
        }

        public static int MultNum(int q)
        {
            num *= q;
            return num;
        }

        public static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Vi du minh hoa Delegate trong C#");
            Console.WriteLine("----------------------------------");

            //tao cac doi tuong delegate
            NumberChanger nc;
            NumberChanger nc1 = new NumberChanger(AddNum);
            NumberChanger nc2 = new NumberChanger(MultNum);
            nc = nc1;
            nc += nc2;

            //goi multicast
            nc(5);
            Console.WriteLine("Gia tri cua num la: {0}", getNum());
            Console.ReadKey();
        }
    }
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Delegate trong C#
Quảng cáo

Cách sử dụng Delegate trong C#

Ví dụ sau minh họa cách sử dụng của delegate trong C#. Delegate với tên printString có thể được sử dụng để tham chiếu phương thức mà nhận một chuỗi như là input và không trả về cái gì.

Chúng ta sử dụng delegate này để gọi hai phương thức: phương thức đầu tiên in chuỗi tới Console, và phương thức thứ hai in nó tới một File.

using System;
using System.IO;
namespace VietJackCsharp
{
    class TestCsharp
    {
        static FileStream fs;
        static StreamWriter sw;

        // khai bao delegate
        public delegate void printString(string s);

        // phuong thuc de in tren console
        public static void WriteToScreen(string str)
        {
            Console.WriteLine("Chuoi la: {0}", str);
        }

        //phuong thuc nay de ghi du lieu vao file
        public static void WriteToFile(string s)
        {
            fs = new FileStream("c:\\message.txt",
            FileMode.Append, FileAccess.Write);
            sw = new StreamWriter(fs);
            sw.WriteLine(s);
            sw.Flush();
            sw.Close();
            fs.Close();
        }

        // phuong thuc nay nhan delegate lam tham so va su dung no de
        // goi cac phuong thuc neu can
        public static void sendString(printString ps)
        {
            ps("Hoc C# co ban va nang cao tai VietJack");
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Vi du minh hoa Delegate trong C#");
            Console.WriteLine("----------------------------------");
            
            printString ps1 = new printString(WriteToScreen);
            printString ps2 = new printString(WriteToFile);
            sendString(ps1);
            sendString(ps2);
            Console.ReadKey();
        }
    }
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Delegate trong C#

Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS.

Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube:

Các bạn có thể mua thêm khóa học JAVA CORE ONLINE VÀ ỨNG DỤNG cực hay, giúp các bạn vượt qua các dự án trên trường và đi thực tập doanh nghiệp với Java. Khóa học có giá chỉ 400K, nhằm ưu đãi, tạo điều kiện cho sinh viên cho thể mua khóa học.

Nội dung khóa học gồm 16 chuơng và 100 video cực hay, học trực tiếp tại https://www.udemy.com/tu-tin-di-lam-voi-kien-thuc-ve-java-core-toan-tap/ Bạn nào có nhu cầu mua, inbox trực tiếp chị Thu, trợ lý anh Tuyền để hỗ trợ thanh toán qua mã QR ngân hàng Việt Nam, fb: https://www.facebook.com/Thule.59

Anh Tuyền, tác giả khóa học, là cựu sinh viên chương trình đào tạo kĩ sư tài năng của đại học Bách Khoa Hà Nội với hơn 5 năm kinh nghiệm đi làm thực tế doanh nghiệp và cũng là Founder website vietjack.com, web giáo dục phổ biến nhất Việt Nam hiện tại (năm 2024). Java cũng là ngôn ngữ lập trình dễ đi xin việc nhất hiện tại, với mức lương cao, hãy nâng cao kiến thức IT của bản thân mình vì một Việt Nam giàu mạnh.

Loạt bài hướng dẫn của chúng tôi dựa một phần trên nguồn tài liệu của: Tutorialspoint.com




Tài liệu giáo viên