Delegate c# là gì

  -  

Một cách thức rất có thể gồm một hoặc nhiều tđam mê số bao gồm kiểu tài liệu không giống nhau, mà lại ví như bạn có nhu cầu truyền một thủ tục làm tmê mệt số thì sao? Làm cố gắng làm sao để C# xử trí những tác dụng Hotline lại (callback) hoặc giải pháp xử lý sự kiện? Câu trả lời là thực hiện delegate.

Bạn đang xem: Delegate c# là gì

Delegate trong C#

Một delegate y hệt như một nhỏ trỏ mang đến một cách tiến hành (Call là con trỏ hàm trong C với C++). Delegate là dạng hình tsi chiếu cùng nó cất tmê say chiếu tới một cách thức. Tất cả những delegate phần nhiều khởi đầu từ lớp System.Delegate.

Một delegate hoàn toàn có thể được knhì báo bằng cách thực hiện từ bỏ khóa delegate, theo sau là chữ ký cách thức nlỗi tiếp sau đây.

delegate ()Chữ ký kết cách làm gồm thương hiệu cách làm, số lượng cùng dạng hình tài liệu của những tđam mê số mà lại ko bao hàm kiểu dữ liệu trả về. Tuy nhiên so với delegate thì chứ đọng ký phương thức bao gồm cả đẳng cấp tài liệu trả về.Ví dụ sau knhì báo một delegate Print.

public delegate void Print(int value);Delegate Print rất có thể được thực hiện để trỏ mang lại bất kỳ phương thức như thế nào có thuộc kiểu dữ liệu trả về và số lượng/đẳng cấp tài liệu của tđam mê số được khai báo với Print. lấy ví dụ như sau minch họa phương pháp thực hiện delegate Print.

class Program // declare delegate public delegate void Print(int value); static void Main(string<> args) // Print delegate points lớn PrintNumber Print printDel = PrintNumber; // or // Print printDel = new Print(PrintNumber); printDel(100000); printDel(200); // Print delegate points to PrintMoney printDel = PrintMoney; printDel(10000); printDel(200); public static void PrintNumber(int num) Console.WriteLine("Number: 0,-12:N0",num); public static void PrintMoney(int money) Console.WriteLine("Money: 0:C", money); Đây là tác dụng khi biên dịch và chạy chương trình:

Number: 10,000Number: 200Money: $ 10,000.00Money: $ 200.00Trong ví dụ bên trên, công ty chúng tôi sẽ knhị báo delegate Print đồng ý tđắm đuối số hình dạng int và trả về mẫu mã void. Trong cách tiến hành Main(), một biến printDel giao diện Print được knhì báo cùng gán thương hiệu cách làm PrintNumber.

Bây tiếng, mỗi lúc Call xúc tiến trở nên printDel vẫn Hotline cho tới cách thức PrintNumber. Tương trường đoản cú, nếu trở thành printDel được gán mang đến thủ tục PrintMoney, thì nó vẫn Call cách làm PrintMoney.

Tấm hình sau đây minc họa mang lại delegate.

*

Tùy lựa chọn, một đối tượng delegate rất có thể được khởi tạo bởi tự khóa new với chỉ định thương hiệu cách thức, nlỗi ví dụ dưới đây:

Print printDel = new Print(PrintNumber);

điện thoại tư vấn delegate

Delegate có thể được Gọi nhỏng một phương thức vì chưng nó là một trong tmê man chiếu cho một thủ tục.

khi call một delegate vẫn Điện thoại tư vấn cho tới phương thức nhưng delegate tmê man chiếu tới. Delegate hoàn toàn có thể được gọi là nhị cách: áp dụng toán tử () hoặc thực hiện cách làm ủy nhiệm Invoke() nlỗi bên dưới đây:

Print printDel = PrintNumber;printDel.Invoke(10000);//orprintDel(10000);Đây là kết quả khi biên dịch với chạy cmùi hương trình:

Number: 10000Number: 10000

Truyền delegate nhỏng một tmê say số

Một cách làm hoàn toàn có thể bao gồm một tsi mê số loại delegate. Phương thơm thức rất có thể Call thực hiện tmê man số delegate này. lấy ví dụ sau minc họa truyền delegate như một tsi số của phương thức:

public static void PrintHelper(Print delegateFunc, int numToPrint) delegateFunc(numToPrint);Trong ví dụ trên, phương thức PrintHelper bao gồm một tmê mẩn số delegateFunc hình dạng Print là một delegate. Nó Hotline thực hiện delegate này: delegateFunc(numToPrint).

lấy một ví dụ dưới đây cho biết biện pháp thực hiện thủ tục PrintHelper:

class Program public delegate void Print(int value); static void Main(string<> args) PrintHelper(PrintNumber, 10000); PrintHelper(PrintMoney, 10000); public static void PrintHelper(Print delegateFunc, int numToPrint) delegateFunc(numToPrint); public static void PrintNumber(int num) Console.WriteLine("Number: 0,-12:N0",num); public static void PrintMoney(int money) Console.WriteLine("Money: 0:C", money); Đây là tác dụng Lúc biên dịch và chạy chương trình:

Number: 10,000Money: $ 10,000.00

Multicast delegate

Delegate rất có thể tsi chiếu cho tới các cách tiến hành một cơ hội. Một delegate tsi chiếu cho tới các phương thức được Hotline là multicast delegate. Toán tử + thêm một cách tiến hành vào đối tượng người sử dụng delegate với toán tử - loại bỏ một cách thức hiện nay tất cả thoát ra khỏi một đối tượng người dùng delegate.

ví dụ như dưới đây vẫn minch họa về multicast delegate:

public delegate void Print(int value);static void Main(string<> args) Print printDel = PrintNumber; printDel += PrintHexadecimal; printDel += PrintMoney; printDel(1000); printDel -= PrintHexadecimal; printDel(2000);public static void PrintNumber(int num) Console.WriteLine("Number: 0,-12:N0",num);public static void PrintMoney(int money) Console.WriteLine("Money: 0:C", money);public static void PrintHexadecimal(int dec) Console.WriteLine("Hexadecimal: 0:X", dec);Đây là tác dụng Khi biên dịch cùng chạy cmùi hương trình:

Number: 1,000Hexadecimal: 3EBMoney: $ 1,000.00Number: 2,000Money: $2,000.00Nhỏng chúng ta có thể thấy vào ví dụ trên, delegate Print biến hóa một multicast delegate bởi nó tđê mê chiếu cho cha phương thơm thức: PrintNumber, PrintMoney cùng PrintHexadecimal. Vì vậy, Khi điện thoại tư vấn thực hiện printDel sẽ gọi tuần từ bỏ toàn bộ những cách tiến hành bên trên.

Delegate cũng rất được thực hiện với Event, anonymous method (thủ tục ẩn danh), delegate Func, delegate Action.

Những vấn đề cần nhớ về delegate vào C#

Delegate là một nhỏ trỏ phương thức (nó ttê mê chiếu mang đến phương thức). Nó là hình trạng tài liệu tyêu thích chiếu.Một cách làm được gán mang lại delegate đề nghị bao gồm thuộc chữ ký kết cùng với delegate.Delegate có thể được Điện thoại tư vấn như một cách thức bình thường thực hiện toán tử () hoặc sử dụng cách thức Invoke().Nhiều thủ tục hoàn toàn có thể được gán cho một delegate bằng tân oán tử +. Nó được call là multicast delegate.

Delegate Func vào C#

C# 3.0 gồm các hình trạng generic delegate tích phù hợp sẵn như Func với kích hoạt do đó bạn không nhất thiết phải tư tưởng những delegate tùy chỉnh như làm việc trên.

Func là một trong những generic delegate trực thuộc namespace System. Nó không tồn tại hoặc có khá nhiều tđắm say số đầu vào với một tđê mê số out. Tđam mê số sau cùng được coi là một tsi mê số out.

Xem thêm: 【Chuẩn 100%】Download Plants Vs Zombies Full Version + Full [email protected]

Ví dụ: delegate Func gồm một tđắm đuối số đầu vào và một tham mê số out được khái niệm vào namespace System như dưới đây:

namespace System public delegate TResult Func(T arg);Tmê say số ở đầu cuối trong ngoặc được coi là kiểu trả về với những tsay đắm số sót lại được xem như là các loại tsi mê số nguồn vào nhỏng vào hình tiếp sau đây.

*

Delegate Func tất cả nhì tđê mê số đầu vào với một tsay mê số out sẽ được trình bày như sau đây.

*

Biến sum tiếp sau đây bao gồm phong cách delegate Func cùng với nhì tsay mê số đầu vào của mẫu mã int với trả về giá trị của kiểu dáng int:

Func sum;Quý Khách có thể gán ngẫu nhiên phương thức như thế nào tất cả nhì tham số int với trả về hình dáng int cho đổi mới sum làm việc trên. Hãy xem ví dụ sau:

class Program static int Sum(int x, int y) return x + y; static void Main(string<> args) Func add = Sum; int result = add(10, 10); Console.WriteLine(result); Đây là công dụng khi biên dịch với chạy chương thơm trình:

20Một hình trạng delegate Func có thể không có hoặc gồm mang lại 16 tham mê số nguồn vào của những thứ hạng dữ liệu khác nhau. Tuy nhiên, nó phải bao gồm một tsi mê số out mang lại hiệu quả. ví dụ như, delegate Func tiếp sau đây không tồn tại ngẫu nhiên tmê mệt số đầu vào nào, nó chỉ bao gồm một tmê man số out.

Func getRandomNumber;

Delegate Func với phương thức ẩn danh vào C#

Quý khách hàng hoàn toàn có thể chỉ định và hướng dẫn một thủ tục ẩn danh mang lại delegate Func bằng cách sử dụng trường đoản cú khóa delegate.

Chúng ta sửa thay đổi lại ví dụ trên một chút, áp dụng thủ tục ẩn danh thay thế sửa chữa cho thủ tục Sum:

class Program static void Main(string<> args) Func add = delegate(int x, int y) return x + y; ; int result = add(10, 10); Console.WriteLine(result); Đây là kết quả Lúc biên dịch với chạy chương trình:

20

Delegate Func với biểu thức Lambda vào C#

Một delegate Func cũng hoàn toàn có thể được thực hiện với biểu thức lambdomain authority, họ lại tiếp tục sửa ví dụ trên nhỏng sau:

class Program static void Main(string<> args) Func add = (x, y) => x + y; int result = add(10, 10); Console.WriteLine(result); Đây là kết quả Lúc biên dịch cùng chạy chương trình:

20

Những điểm cần ghi nhớ về delegate Func vào C#

Func là giao diện delegate được tích hòa hợp sẵn vào C#.Delegate Func cần trả về một cực hiếm.Delegate Func có thể không có hoặc gồm cho 16 tđắm đuối số đầu vào.Delegate Func ko cho phép tsay mê số ref cùng out.

Delegate kích hoạt vào C#

Action cũng là 1 trong các loại delegate được khái niệm vào namespace System. Delegate kích hoạt tương tự như nlỗi delegate Func ngoại trừ delegate Action không trả về quý hiếm. Nói bí quyết không giống, một delegate Action hoàn toàn có thể được áp dụng với một phương thức bao gồm phong cách trả về là void.

ví dụ như minch họa thực hiện delegate Action:

static void ConsolePrint(int i) Console.WriteLine(i);static void Main(string<> args) kích hoạt print = ConsolePrint; print(10);Đây là hiệu quả khi biên dịch với chạy chương thơm trình:

10quý khách rất có thể khởi chế tạo ra một delegate kích hoạt bằng phương pháp áp dụng tự khóa new hoặc bằng phương pháp hướng dẫn và chỉ định thẳng một thủ tục nhỏng dưới đây:

kích hoạt printActionDel = ConsolePrint;//Orkích hoạt printActionDel = new Action(ConsolePrint);Một đại biểu hành động rất có thể mất cho tới 16 tđê mê số đầu vào trực thuộc những loại không giống nhau.

Delegate Action với cách thức ẩn danh vào C#

Một cách tiến hành ẩn danh cũng có thể được hướng đẫn cho 1 delegate Action:

static void Main(string<> args) kích hoạt print = delegate(int i) Console.WriteLine(i); ; print(10);Đây là hiệu quả Khi biên dịch với chạy chương thơm trình:

10

Delegate kích hoạt với biểu thức Lambdomain authority vào C#

Biểu thức Lambdomain authority cũng rất có thể được áp dụng với delegate Action:

static void Main(string<> args) Action print = i => Console.WriteLine(i); print(10);Đây là kết quả Lúc biên dịch cùng chạy cmùi hương trình:

10Do kia, chúng ta có thể thực hiện bất kỳ thủ tục làm sao không trả về quý hiếm đến delegate kích hoạt.

Những điểm cần nhớ về delegate kích hoạt vào C#

Delegate kích hoạt cũng như delegate Func ngoài Việc nó ko trả về quý hiếm. Kiểu trả về đề xuất là void.Delegate kích hoạt có thể không có hoặc bao gồm mang lại 16 tsi mê số đầu vào.

Ưu điểm của delegate Func và Action

Dễ dàng với mau lẹ nhằm khái niệm những delegate.Làm mang lại mã ngắn thêm gọn gàng với dễ nhìn đọc.Kiểu tài liệu tương xứng nhìn trong suốt ứng dụng.

Delegate Predicate vào C#

Predicate cũng là một delegate như delegate Func cùng Action. Nó thay mặt cho 1 phương thức cất một tập thích hợp các tiêu chí cùng chất vấn xem tsay đắm số đã truyền gồm đáp ứng những tiêu chí kia hay là không. Một cách thức được gán mang đến delegate Predicate phải gồm một tsi mê số nguồn vào với trả về hình dáng boolean.

Delegate Predicate được có mang vào namespace System.

Cũng hệt như các nhiều loại delegate không giống, delegate Predicate cũng hoàn toàn có thể được sử dụng với ngẫu nhiên cách thức, cách làm ẩn danh hoặc biểu thức lambda nào.

static bool IsUpperCase(string str) return str.Equals(str.ToUpper());static void Main(string<> args) Predicate isUpper = IsUpperCase; bool result = isUpper("hello world!!"); Console.WriteLine(result);Đây là kết quả khi biên dịch với chạy chương thơm trình:

False

Delegate Predicate với cách làm ẩn danh trong C#

Một phương thức ẩn danh cũng rất có thể được gán đến nhiều loại đại biểu Dự đân oán nlỗi sau đây.

Xem thêm: Hình Bình Hành Là Gì - Lý Thuyết Hình Bình Hành

static void Main(string<> args) Predicate isUpper = delegate(string s) return s.Equals(s.ToUpper()); ; bool result = isUpper("hello world!!");Đây là tác dụng Khi biên dịch cùng chạy chương trình:

False

Delegate Predicate với biểu thức Lambda vào C#

Biểu thức lambdomain authority cũng có thể được gán đến loại delegate Predicate nlỗi sau đây.

static void Main(string<> args) Predicate isUpper = s => s.Equals(s.ToUpper()); bool result = isUpper("hello world!!");Đây là tác dụng khi biên dịch với chạy chương trình:

False

Những điểm cần ghi nhớ về delegate Predicate vào C#:

Delegate Predicate bao gồm một tham số nguồn vào và mẫu mã trả về boolean. Lập Trình C# • Lập Trình C# Cơ Bản