Kết hợp delegate với lambda expression

Delegate là cách cho phép dùng một method bên ngoài để thực thi một hành động tham chiếu đến thuộc tính của đối tượng.

Trước khi xem cách sử dụng trong C#, ta cần hiểu rõ tại sao và khi nào cần dùng đến Delegate.

Vậy thì, khi nào cần truyền một function để thực thi. Một số trường hợp phổ biến ta hay thấy là ứng dụng của delegate:

  • Định nghĩa phương thức call-back
  • Bạn cần dùng kết quả từ delegate

Đoạn code dưới đây (cách khai báo delegate trước đây) khai báo rành mạch một delegate có tên là DisplayMessage và gán than chiếu cho phương thức WriteLine hoặc ShowWindowsMessage:

using System;
using System.Windows.Forms;

delegate void DisplayMessage(string message);

public class TestCustomDelegate
{
   public static void Main()
   {
      DisplayMessage messageTarget;
      // Tham chieu den phuong thuc se duoc goi
      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      // Goi den delegate
      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

Để khai báo Delegate không rành mạch (không cần khai bai trước kiểu của delegate), ta dùng Action<T> như sau:

using System;
using System.Windows.Forms;

public class TestAction1
{
   public static void Main()
   {
      Action<string> messageTarget;

      // Tham chieu den phuong thuc se duoc goi
      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      // Goi den delegate
      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

Lambda Expression quen thuộc hơn với developer những năm gần đây, cách này giúp đơn giản và giảm các khai báo không cần thiết.

using System;
using System.Windows.Forms;

public class TestLambdaExpression
{
   public static void Main()
   {
      // Dung lambda de truyen noi dung func
      DisplayMessage(message => {
         if (Environment.GetCommandLineArgs().Length > 1)
            ShowWindowsMessage(message);
         else
            Console.WriteLine(message);         
      });
   }

   private static void DisplayMessage(Action<string> messageTarget){
      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

Để lại một bình luận