+3

Tìm hiểu về Delegate trong C#

Hi anh em, Đầu tuần chúc anh em một ngày làm việc hiệu quả và đầy năng lượng. Hôm nay mình sẽ giới thiệu về delegate trong C#, một tính năng khá phổ biến. Không để anh em chờ lâu, cùng bắt đầu vào bài viết nào. Bài viết này mình sẽ nói về định nghĩa, các cách sử dụng và ví dụ đơn giản về delegate trong c#.

1. Delegate là gì?

  • Delegate là một kiểu dữ liệu đặc biệt trong C# được sử dụng để khai báo tham chiếu tới các hàm hoặc phương thức (Có thể hiểu là con trỏ trỏ tới hàm). Khi gán một hàm hoặc phương thức cho delegate thì delegate sẽ trỏ tham chiếu tới hàm, phương thức đó. Sau đó thay vì ta gọi hàm trực tiếp, ta có thể thông qua delegate để gọi mà không cần biết rõ tên hàm đó. Delegate giúp cho việc gọi hàm trở nên linh hoạt hơn.
using System;

delegate int CalculatorDelegate(int num1, int num2);

class Program {
    static void Main(string[] args) {
        // Khởi tạo delegate
        CalculatorDelegate calculatorDelegate = new CalculatorDelegate(MaxNumber);

        // Gọi phương thức thông qua delegate
        int result = calculatorDelegate(10, 20);

        // In ra giá trị lớn nhất của hai số
        Console.WriteLine("Max number: " + result);
    }

    static int MaxNumber(int num1, int num2) {
        return (num1 > num2) ? num1 : num2;
    }
}

  • Ở ví dụ trên thay vì gọi trực tiếp hàm MaxNumber để tìm số lớn nhất trong 2 số, ta gọi tới biến delegate calculatorDelegate.

2. Sử dụng delegate gọi tới các hàm khác nhau

using System;

// Khai báo delegate
delegate int Calculator(int a, int b);

class Program {
    static int Add(int a, int b) {
        return a + b;
    }

    static int Subtract(int a, int b) {
        return a - b;
    }

    static void Main(string[] args) {
        // Tạo instance của delegate, truyền phương thức Add vào delegate
        Calculator calculator = new Calculator(Add);

        // Sử dụng delegate để tính tổng của 2 số
        int result = calculator(10, 5);
        Console.WriteLine("10 + 5 = " + result);

        // Truyền phương thức Subtract vào delegate
        calculator = new Calculator(Subtract);

        // Sử dụng delegate để tính hiệu của 2 số
        result = calculator(10, 5);
        Console.WriteLine("10 - 5 = " + result);

        Console.ReadKey();
    }
}

  • Ở trên ví dụ trên ta sử delegate calculator để gọi tới phương thức Add nếu ta gán calculator = new Calculator(Add); gọi tới phương thức Subtract nếu ta gán calculator = new Calculator(Subtract);.
  • Qua việc sử dụng cùng 1 delegate để gọi tới các hàm khác nhau ta thấy việc gọi hàm rất linh hoạt và dễ dàng.

3. Sử dụng delegate để tạo ra một callback

using System;

delegate void Callback(string message);

class Program
{
    static void Main(string[] args)
    {
        CallMethodWithCallback("Hello, world!", DisplayMessage);
    }

    static void CallMethodWithCallback(string message, Callback callback)
    {
        Console.WriteLine("Method called with message: " + message);
        callback(message);
    }

    static void DisplayMessage(string message)
    {
        Console.WriteLine("Callback called with message: " + message);
    }
}
  • Ở ví dụ trên ta thấy ta sẽ khai báo một callback với delegate delegate void Callback(string message);. Khi ta gọi function CallMethodWithCallback ta có thể truyền function vào như một tham số: CallMethodWithCallback("Hello, world!", DisplayMessage);
  • Ví dụ trên sẽ ra kết quả:
Method called with message: Hello, world!
Callback called with message: Hello, world!

4. Sử dụng delegate trong Lambda Expression

delegate int Operation(int a, int b); // Khai báo delegate

class Program
{
    static void Main(string[] args)
    {
        // Sử dụng delegate trong lambda expression
        Operation sum = (a, b) => a + b;
        Operation product = (a, b) => a * b;

        int x = 5, y = 3;
        Console.WriteLine($"Tổng của {x}{y}{sum(x, y)}"); // Kết quả: Tổng của 5 và 3 là 8
        Console.WriteLine($"Tích của {x}{y}{product(x, y)}"); // Kết quả: Tích của 5 và 3 là 15
    }
}

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

    static void Main(string[] args)
    {
        Func<int,int, int> add = Sum;

        int result = add(10, 10);

        Console.WriteLine(result); 
    }
}
  • Func<int, int, int> là một delegate có kiểu int với 2 tham số truyền vào kiểu int.

5. Tổng kết

  • Còn rất nhiều cách sử dụng delegate trong c#, ở đây mình chỉ giới thiệu khái niệm và ví dụ đơn giản để anh em có thể hiểu delegate là gì và cách sử dụng đơn giản.
  • Cảm ơn mọi người đã xem bài viết. Chúc mọi người một cuối tuần vui vẻ.
  • Nếu có thắc mắc về các phần trong bài này mọi người có thể inbox qua facebook:https://www.facebook.com/FriendsCode-108096425243996 Mình sẽ giải đáp thắc mắc trong tầm hiểu biết. Cảm ơn mọi người!
  • Hoặc liên hệ mình qua facebook cá nhân: https://www.facebook.com/Flamesofwars/

6. Tham khảo:


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.