Tuesday, June 28, 2016

Delegate trong C#

Delegate trong C#
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ộtDelegate 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 <return type> <delegate-name> <parameter list>

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óanew 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 DelegateAppl
{
   class TestDelegate
   {
      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)
      {
         //create delegate instances
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         
         //calling the methods using the delegate objects
         nc1(25);
         Console.WriteLine("Value of Num: {0}", getNum());
         nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}
Khi code trên được biên dịch và thực thi, nó sẽ cho kết quả:
Value of Num: 35
Value of Num: 175

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 DelegateAppl
{
   class TestDelegate
   {
      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)
      {
         //create delegate instances
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         
         //calling multicast
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}
Khi code trên được biên dịch và thực thi, nó sẽ cho kết quả:
Value of Num: 75

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 DelegateAppl
{
   class PrintString
   {
      static FileStream fs;
      static StreamWriter sw;
      
      // delegate declaration
      public delegate void printString(string s);

      // this method prints to the console
      public static void WriteToScreen(string str)
      {
         Console.WriteLine("The String is: {0}", str);
      }
      
      //this method prints to a 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();
      }
      
      // this method takes the delegate as parameter and uses it to
      // call the methods as required
      public static void sendString(printString ps)
      {
         ps("Hello World");
      }
      static void Main(string[] args)
      {
         printString ps1 = new printString(WriteToScreen);
         printString ps2 = new printString(WriteToFile);
         sendString(ps1);
         sendString(ps2);
         Console.ReadKey();
      }
   }
}
Khi code trên được biên dịch và thực thi, nó sẽ cho kết quả:
The String is: Hello World
Loạt bài hướng dẫn học C# cơ bản và nâng cao của chúng tôi dựa trên nguồn tài liệu của:Tutorialspoint
Follow https://www.facebook.com/giaithuatlaptrinhTN/để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.

Bài Viết Liên Quan