C # - Đại biểu

Các đại biểu của C # tương tự như các con trỏ tới các hàm, trong C hoặc C ++. Adelegatelà một biến kiểu tham chiếu chứa tham chiếu đến một phương thức. Tham chiếu có thể được thay đổi trong thời gian chạy.

Các đại biểu đặc biệt được sử dụng để triển khai các sự kiện và các phương thức gọi lại. Tất cả các đại biểu được hoàn toàn bắt nguồn từSystem.Delegate lớp học.

Tuyên bố đại biểu

Khai báo ủy quyền xác định các phương thức có thể được tham chiếu bởi đại biểu. Một đại biểu có thể tham chiếu đến một phương thức có cùng chữ ký với của đại biểu.

Ví dụ, hãy xem xét một đại biểu -

public delegate int MyDelegate (string s);

Đại biểu đứng trước có thể được sử dụng để tham chiếu bất kỳ phương thức nào có tham số chuỗi đơn và trả về một biến kiểu int .

Cú pháp khai báo ủy quyền là:

delegate <return type> <delegate-name> <parameter list>

Khởi tạo đại biểu

Khi một kiểu ủy quyền được khai báo, một đối tượng ủy quyền phải được tạo với new từ khóa và được liên kết với một phương pháp cụ thể. Khi tạo một đại biểu, đối số được chuyển đếnnewbiểu thức được viết tương tự như một cuộc gọi phương thức, nhưng không có đối số cho 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 khai báo, khởi tạo và sử dụng đại biểu có thể được sử dụng để tham chiếu các phương thức nhận tham số nguyên và trả về giá trị nguyên.

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 đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Value of Num: 35
Value of Num: 175

Đa nhóm của một đại biểu

Đối tượng ủy nhiệm có thể được tạo bằng cách sử dụng toán tử "+". Một đại biểu sáng tác gọi hai đại biểu mà nó được soạn từ. Chỉ các đại biểu cùng loại mới có thể được thành lập. Toán tử "-" có thể được sử dụng để xóa một đại biểu thành phần khỏi một đại biểu đã cấu thành.

Sử dụng thuộc tính này của ủy quyền, bạn có thể tạo một danh sách gọi các phương thức sẽ được gọi khi một ủy nhiệm được gọi. Đây được gọi làmulticastingcủa một đại biểu. Chương trình sau đây trình bày đa hướng của một đại biểu:

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 đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Value of Num: 75

Sử dụng đại biểu

Ví dụ sau minh họa việc sử dụng đại biểu. Chuỗi printString của đại biểu có thể được sử dụng để tham chiếu phương thức nhận một chuỗi làm đầu vào và không trả về kết quả nào.

Chúng tôi sử dụng đại diện này để gọi hai phương thức, phương thức đầu tiên in chuỗi ra bảng điều khiển và phương thức thứ hai in ra tệp -

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 đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

The String is: Hello World