C# - Delegates: Hướng dẫn thân thiện cho người mới bắt đầu

Xin chào các bạn, những ngôi sao lập trình tương lai! Hôm nay, chúng ta sẽ cùng khám phá thế giới fascinante của các delegate trong C#. Đừng lo lắng nếu bạn chưa từng nghe về chúng trước đây - đến cuối bài hướng dẫn này, bạn sẽ thành thạo delegate! Hãy cùng bắt đầu hành trình thú vị này.

C# - Delegates

Delegates Là Gì?

Hãy tưởng tượng bạn đang tổ chức một buổi tiệc và bạn cần ai đó quản lý phần nhạc. Thay vì tự làm, bạn ủy quyền nhiệm vụ này cho bạn bè của bạn là DJ. Trong C#, delegate hoạt động tương tự - chúng giống như những người đưa tin nhỏ bé có thể giữ và gọi các phương thức cho chúng ta.

Nói đơn giản hơn, một delegate là một kiểu đại diện cho các tham chiếu đến các phương thức với danh sách tham số và kiểu trả về cụ thể. Hãy nghĩ của nó như một bản đồ cho một phương thức.

Khai báo Delegates

Hãy bắt đầu bằng cách học cách khai báo một delegate. Cú pháp rất đơn giản:

public delegate void SimpleDelegate();

Điều này khai báo một delegate tên là SimpleDelegate có thể tham chiếu đến các phương thức không có tham số và không trả về gì (void).

Đây là một ví dụ khác:

public delegate int MathDelegate(int x, int y);

MathDelegate này có thể tham chiếu đến bất kỳ phương thức nào nhận hai số nguyên và trả về một số nguyên.

Tạo đối tượng Delegates

Bây giờ chúng ta đã khai báo delegate, hãy xem cách sử dụng chúng. Chúng ta sẽ bắt đầu bằng cách tạo một phương thức phù hợp với chữ ký của delegate:

public static void SayHello()
{
Console.WriteLine("Hello, Delegates!");
}

// Tạo đối tượng delegate
SimpleDelegate greet = new SimpleDelegate(SayHello);

// Gọi delegate
greet();

Khi chúng ta chạy đoạn mã này, nó sẽ выводить: "Hello, Delegates!"

Hãy phân tích nó:

  1. Chúng ta đã định nghĩa một phương thức SayHello phù hợp với chữ ký của SimpleDelegate.
  2. Chúng ta đã tạo một đối tượng SimpleDelegate và gán phương thức SayHello cho nó.
  3. Chúng ta đã gọi delegate bằng greet(), điều này gọi SayHello.

Đa phương thức của Delegate

Bây giờ, delegate trở nên thực sự thú vị. Chúng có thể giữ tham chiếu đến nhiều phương thức! Điều này được gọi là multicasting. Hãy xem nó trong hành động:

public static void SayHello() { Console.WriteLine("Hello"); }
public static void SayGoodbye() { Console.WriteLine("Goodbye"); }

SimpleDelegate greetings = SayHello;
greetings += SayGoodbye;

greetings(); // Điều này sẽ gọi cả SayHello và SayGoodbye

Output:

Hello
Goodbye

Đó có phải không tuyệt vời không? Chúng ta đã thêm hai phương thức vào delegate của mình, và khi chúng ta gọi nó, cả hai phương thức đều được gọi theo thứ tự chúng được thêm vào.

Sử dụng Delegates

Delegate rất hữu ích trong nhiều tình huống. Một ví dụ phổ biến là trong xử lý sự kiện. Hãy xem một ví dụ đơn giản:

public delegate void TemperatureChangedHandler(float newTemperature);

class Thermostat
{
private float _temperature;
public event TemperatureChangedHandler TemperatureChanged;

public float Temperature
{
get { return _temperature; }
set
{
if (_temperature != value)
{
_temperature = value;
OnTemperatureChanged();
}
}
}

protected virtual void OnTemperatureChanged()
{
if (TemperatureChanged != null)
{
TemperatureChanged(_temperature);
}
}
}

class Program
{
static void Main()
{
Thermostat thermostat = new Thermostat();
thermostat.TemperatureChanged += HandleTemperatureChange;

thermostat.Temperature = 25.5f;
}

static void HandleTemperatureChange(float newTemperature)
{
Console.WriteLine($"Temperature changed to {newTemperature}°C");
}
}

Trong ví dụ này, chúng ta đã tạo một lớp Thermostat sử dụng một delegate để thông báo khi nhiệt độ thay đổi. Phương thức Main đăng ký sự kiện này, và khi nhiệt độ được đặt, nó kích hoạt phương thức HandleTemperatureChange.

Phương thức Delegate

Dưới đây là bảng một số phương thức liên quan đến delegate phổ biến:

Phương thức Mô tả
Invoke Gọi các phương thức mà delegate đang giữ
BeginInvoke Bắt đầu một cuộc gọi không đồng bộ của delegate
EndInvoke Kết thúc một cuộc gọi không đồng bộ của delegate
GetInvocationList Trả về một mảng các delegate đại diện cho danh sách gọi

Kết luận

Chúc mừng! Bạn đã chính thức bước vào thế giới của các delegate trong C#. Chúng ta đã qua việc khai báo delegate, tạo đối tượng delegate, multicasting, và thậm chí một ví dụ thực tế với xử lý sự kiện.

Nhớ rằng, delegate có thể trôngabstract ban đầu, nhưng chúng là những công cụ vô cùng mạnh mẽ trong C#. Chúng cho phép thiết kế linh hoạt và 松散耦合, đặc biệt trong lập trình dựa trên sự kiện.

Trong hành trình tiếp tục của bạn với C#, bạn sẽ tìm thấy越来越多的用途 cho delegate. Chúng giống như những con dao đa năng trong bộ công cụ lập trình của bạn - đa năng và luôn hữu ích khi bạn cần chúng.

Tiếp tục luyện tập, giữ vững sự tò mò, và trước khi bạn biết, bạn sẽ ủy quyền các nhiệm vụ cho mã của mình như một chuyên gia! Chúc bạn lập trình vui vẻ!

Credits: Image by storyset