Tìm hiểu có mang về Delegate tạo nên các biến chuyển hàm ủy quyền vào C#, gán những hàm vào delegate, call hàm delegate, sử mẫu kích hoạt và Func để gấp rút tạo đổi mới delegate, thực hiện delelage làm cho tham số phương thức


Giới thiệu delegate

Delegate (hàm ủy quyền) là 1 trong kiểu dữ liệu, nó dùng để làm tham chiếu (trỏ đến) đến những hàm (phương thức) gồm tham số và kiểu trả về phù hợp với khai báo kiểu. Khi sử dụng đến delegate bạn có thể gán vào nó một, các hàm (phương thức) tất cả sự tương thích về tham số, hình dáng trả về, sau đó dùng nó để hotline hàm (giống nhỏ trỏ vào C++), các event trong C# chính là các hàm được gọi trải qua delegate, chúng ta có thể dùng delegate nhằm xây dựng những hàm callback, nhất là các Event

Delegate được dùng thịnh hành khi gán các biểu thức lambda


Ví dụ áp dụng delegate

1 Đầu tiên đề xuất khai báo một delegate, khai báo hệt như cách khai báo cách tiến hành nhưng gồm thêm từ khóa delegate và không tồn tại thân phương thức. Ví dụ như sau khai báo một delegate có tên là Show
Log

public delegate void Show
Log(string message); 2 lúc đã gồm Show
Log
, nó sử dụng như một kiểu dữ liệu để khai báo các biến, những biến này rất có thể gán vào nó các hàm tất cả sự tương đồng về tham số và kiểu trả về cùng với khai báo delegate ví dụ khai báo biến:

Show
Log show
Log; Thi hành delegate

Sau khi đổi thay delegate được gán hàm vào, hoàn toàn có thể dùng biến chuyển delegate nhằm thi hành bằng phương pháp gọi: var
Delegate.Invoke(các-tham-số)
hoặc var
Delegate(các-tham-số)

3 chế tạo hai cách thức Info cùng Warning có tham số tương tự với Show
Log, nghĩa là có một tham số thứ hạng string, trả về void:

static public void Info(string s) // ...static public void Warning(string s) // ... Bởi vì Info, Warning có tương đồng về thông số với delegate trên, đề nghị hai hàm này hoàn toàn có thể dùng nhằm gán vào trở thành kiểu Show
Log, coi đoạn mã khá đầy đủ sau:

Logs.cs

using System;namespace CS008_Anonymous public class Logs // Khai báo một delegate public delegate void Show
Log(string message); // Phương thức tương đương với Show
Log (tham số, dạng hình trả về) static public void Info(string s) Console.Foreground
Color = Console
Color.Green; Console.Write
Line(string.Format("Info: 0", s)); Console.Reset
Color(); // Phương thức tương đồng với Show
Log (tham số, mẫu mã trả về) static public void Warning(string s) Console.Foreground
Color = Console
Color.Red; Console.Write
Line(string.Format("Waring: 0", s)); Console.Reset
Color(); public static void Test
Show
Log() Show
Log show
Log; show
Log = Info; // show
Log gán bởi phương thức Info show
Log("Thông báo"); // thực hành delegate chính là thi hành Info show
Log = Warning; // show
Log gán bằng phương thức Warning show
Log("Thông báo"); // thực hành delegate chính là thi hành Info tác dụng chạy đoạn, khi hotline hàm Logs.Test
Show
Log();:

Waring: Thông báo
Info: thông báo

Gán các phương thức vào delegate

khi sử dụng delegate chạy một phương thức, cần đảm bảo biến delegate đó đã được gán cách tiến hành (biến khác null), hoàn toàn có thể bạn kiểm tra trước lúc gọi ví dụ: if (show
Log != null) show
Log("Mgs") hoặc đính gọn rộng show
Log?.Invoke("Mgs");

4 Một delegate có thể đưa vào nó nhiều phương thức để một lần gọi thi hành toàn bộ các phương thức nó chứa

Toán tử += Nối thêm một thủ tục vào delegate, ví dụ delegatevar += method1 Toán tử -= : loại trừ 1 phương ngơi nghỉ cuối (nếu cách tiến hành đó có trong delegate, tính tự cuối) , lấy ví dụ delegatevar -= method1

Ví dụ:

public static void Test
Show
Log
Multi() Show
Log show
Log; show
Log = null; show
Log += Warning; // Nối thêm Warning vào delegate show
Log += Info; // Nối thêm Info vào delegate show
Log += Warning; // Nối thêm Warning vào delegate //Một lần call thi hành tất cả các cách thức trong chuỗi delegate show
Log("Test
Log"); //Hoặc an toàn: show
Log?.Invoke("Test
Log");Gọi cách làm Test
Show
Log
Multi thì kết quả:

Waring: Test
Log
Info: Test
Log
Waring: Test
Log 5 quanh đó cách gán đến delegate một hàm có tên cụ thể như trên, chúng ta có thể gán một thủ tục Anonymou, ví dụ:

show
Log += (x) => Console.Write

// Cộng những Delegatepublic static void Test
Show
Log
Plus() Show
Log show
Log1 = (x)=> Console.Write
Line($"-----x-----");; Show
Log show
Log2 = Warning; Show
Log show
Log3 = Info; var all = show
Log1 + show
Log2 + show
Log3 + show
Log1; all("Xin Chào");Gọi cách làm Test
Show
Log
Plus công dụng là:

-----Xin Chào-----Waring: Xin Chào
Info: Xin Chào-----Xin Chào-----

Func với Action

Func và action là hai mẫu mã delegate tư tưởng sẵn, góp bạn gấp rút tạo ra thay đổi kiểu delegate nhưng mà không mất công khai báo, coi lại lấy ví dụ trên nếu thực hiện đến Func, action thì không cần phải có dòng khai báo:

public delegate void Show
Log(string message);

Sử dụng Func

Func là chủng loại delegate có kiểu trả về. Để khai báo trở thành delegate dùng cú pháp như sau:

Func var_delegate; Kiểu sau cuối trong khai báo Func là hình dạng trả về của hàm, rất có thể thiếu tham số nhưng không được thiếu kiểu trả về

Ví dụ ý muốn có biến đổi delegate thương hiệu bien1 tương đương với hàm bao gồm 2 tham số, tham tiên phong hàng đầu kiểu int, tham số 2 vẻ bên ngoài string, cùng hàm trả về mẫu mã bool thì tạo trở nên đó như sau:

Func bien1;Khai báo trên nếu như bạn dùng cách thông thường tương ứng với:

// Khai báo delegate nghỉ ngơi lớpdelegate bool Delegate
Name(int a, string b);// Khai báo biến trong phương thức
Delegate
Name bien1; Ví dụ:

using System;namespace CS008_Anonymous class Func
Action static int Sum(int x, int y) return x + y; public static void Test
Func(int x, int y) Func tinhtong; // đổi thay tinhtong cân xứng với những hàm trả về mẫu mã int, tất cả 2 tham số đẳng cấp int tinhtong = Sum; // Hàm Sum tương xứng nên có thể gán cho biến đổi var ketqua = tinhtong(x, y); Console.Write
Line(ketqua); Khi gọi cách thức Test
Func kết quả:

Func
Action.Test
Func(5, 6); // In ra: 11

Sử dụng Action

Action giống như như Func, điều khác độc nhất là nó không có kiểu trả về, khai báo cơ bạn dạng như sau:

Action var_delegate; Nghĩa là đổi thay kiểu Action có thể gán bằng những hàm bao gồm kiểu trả về void

Trở lại ví dụ mang đến hai hàm Info với Warning làm việc trên, hoàn toàn có thể sử dụng tức thì đoạn code sau, nhằm có hiệu quả tương tự:

public static void Test
Action(string s) kích hoạt show
Log = null; show
Log += Logs.Warning; // Nối thêm Warning vào delegate show
Log += Logs.Info; // Nối thêm Info vào delegate show
Log += Logs.Warning; // Nối thêm Warning vào delegate // Một lần điện thoại tư vấn thi hành tất cả các thủ tục trong chuỗi delegate show
Log("Test
Log");

Sử dụng Delegate làm cho tham số hàm

hoàn toàn có thể sử dụng delegate có tác dụng tham số của phương thức, nó có vai trò giống như những hàm callback linh hoạt. Xem lấy một ví dụ sau:

// áp dụng Delegate làm tham số phương thức, truyền callbackstatic void Tinh
Tong(int a, int b, action callback) int c = a + b; // hotline callback callback(c.To
String());public static void Test
Tinh
Tong() Tinh
Tong(5,6, (x) => Console.Write
Line($"Tổng nhì số là: x")); Tinh
Tong(1,3, Logs.Info); Source code: CS008_Anonymous (Git), hoặc tải ex008-1

Dẫn nhập

Ở bài học kinh nghiệm trước, chúng ta đã cùng nhau mày mò về ILIST vào C#. Bây giờ chúng ta sẽ cùng tò mò về Delegate trong C#.

Bạn đang xem: Cách dùng delegate trong c#

Nội dung

Để hiểu hiểu bài xích này tốt nhất chúng ta nên có kiến thức cơ bản về các phần:

Trong bài học kinh nghiệm này, chúng ta sẽ cùng khám phá các vấn đề:

Delegate là gì?
Khai báo Delegate trong C#Khởi tạo ra Delegate trong C#Multicast(đa hướng) một Delegate vào C#Cách dùng Delegate vào C#Dùng Delegate như một call-back function

Delegate là gì?

Delegate trong C# tương tự như như bé trỏ hàm vào C hoặc C++.

Delegate là một biến đổi kiểu tham chiếu(references) chứa tham chiếu cho tới một phương thức.

Tham chiếu của Delegate rất có thể thay đổi runtime(khi công tác đang thực thi).

Delegate thường xuyên được dùng làm triển khai những phương thức hoặc sự kiện call-back.

Bạn cứ gọi Delegate là một biến chuyển bình thường, biến đổi này đựng hàm mà bạn cần gọi. Sau này kéo ra sài như hàm bình thường. Quý giá của trở thành Delegate bây giờ là tham chiếu mang đến hàm. Có thể thay đổi runtime khi công tác đang chạy.

Delegate được dẫn xuất từ bỏ lớp System.Delegate trong C#.

Khai báo Delegate trong C#

Khai báo Delegate vào C# sẽ giống như như khai báo một biến. Nhưng bắt buộc thêm trường đoản cú khóa Delegate để xác định đó là một Delegate. Đồng thời vày Delegate là nhằm tham chiếu mang đến một hàm, nên cũng cần được khai báo kèm kiểu dữ liệu trả về của với tham số nguồn vào của Delegate khớp ứng với hàm tham chiếu.

Công thức:

delegate kiểu trả về> tên delegate> (danh sách tha số ví như có>);

Ví dụ:

delegate int My
Delegate(string s);Lưu ý: Chữ delegate viết thường

Lúc này họ đã chế tạo một Delegate có tên là My
Delegate. My
Delegatecó thứ hạng trả về là int, một tham số đầu vào là string.

My
Delegatelúc này có thể dùng làm cho kiểu tài liệu cho hồ hết Delegate tới hàm khớp ứng kiểu trả về với tham số đầu vào.

Khởi tạo nên và thực hiện Delegate trong C#

Khi hình dáng Delegateđược khai báo, đối tượng người dùng Delegatephải được chế tác với từ khóa new và được tham chiếu đến một thủ tục cụ thể. Cách tiến hành này bắt buộc cùng thứ hạng trả về cùng tham số đầu vào với Delegateđã tạo.

Khi sản xuất một Delegate, thông số được truyền cùng với biểu thức new được viết giống như như một lời gọi phương thức, nhưng không gồm tham số tới cách làm đó. Tức là chỉ truyền tên hàm vào thôi. Delegatesẽ tự đánh giá hàm được gửi vào tất cả cùng kiểu dữ liệu trả ra và cùng tham số đầu vào hay không.

Ví dụ:

class Program delegate int My
Delegate(string s); static void Main(string<> args) Console.Output
Encoding = Encoding.Unicode; My
Delegate convert
To
Int = new My
Delegate(Convert
String
To
Int); string number
STR = "35"; int value
Converted = convert
To
Int(number
STR);Console.Write
Line("Giá trị đang convert thành int: " + value
Converted); Console.Read
Line(); static int Convert
String
To
Int(string string
Value) int value
Int = 0; Int32.Try
Parse(string
Value, out value
Int);Console.Write
Line("Đã ép kiểu dữ liệu thành công"); return value
Int; Kết trái chạy chương trình:

*

Để các bạn hiểu rõ hơn về đoạn code trên thì bản thân sẽ giải thích một chút:

Ở phía trên mình sản xuất một hàm Convert
String
To
Int làm trọng trách là gửi kiểu tài liệu của một trong những từ string sang trọng int.Mình sử dụng Delegatebằng bí quyết tạo một phát triển thành convert
To
Int bao gồm kiểu tài liệu là My
Delegate. Convert
To
Int này bản thân new My
Delegatevới tham số nguồn vào là tên hàm Convert
String
To
Int(lưu ý chỉ tên hàm thôi).Mình gồm biến number
STR kiểu string khởi sinh sản giá trị là 35.Mình tạo nên một phát triển thành value
Converted mẫu mã int khởi chế tạo nó bằng hiệu quả gọi Delegateconvert
To
Int với tham số truyền vào Delegatelà vươn lên là number
STR.Kết quả xuất ra màn hình hiển thị Console là số 35.

Nhận thấy Delegateconvert
To
Int bản thân sử dụng tựa như như một hàm bình thường.

Xem thêm: Đầm Công Chúa Trễ Vai Công Chúa Siêu Sang, Với Nhiều Ưu Đãi, Đầm Xòe Công Chúa Trễ Vai Chất Lượng, Giá Tốt

Do My
Delegateđã khởi tạo đồng bộ kiểu dữ liệu trả về với tham số đầu vào với hàm Convert
String
To
Int cần convert
To
Int mới vừa lòng điều kiện khởi chế tạo và áp dụng của hàm Convert
String
To
Int này.

Vậy Delegatebản hóa học chỉ là 1 trong những biến sửa chữa cho hàm, đổi mới này tham chiếu cho hàm nó muốn tham chiếu để sửa chữa khi dùng. Bí quyết dùng y như gọi một hàm.

Vì sao yêu cầu Delegate? khi chúng ta cần dùng một hàm như một biến ví dụ như tham số truyền vào của một hàm, hàm call-back, event…

Multicast(đa hướng) một Delegate vào C#

Khi bạn cần thực hiện tại một chuỗi hàm với cùng kiểu trả về và thuộc tham số đầu vào mà không thích gọi các hàm tuần từ (chỉ gọi 1 hàm 1 lần duy nhất). Thời điểm này bạn sẽ cần sử dụng đến Multicast Delegate.

Bản chất bạn có thể làm một chuỗi Delegatecùng kiểu Delegatebằng biện pháp dùng toán tử +. Bây giờ khi chúng ta gọi Delegatesẽ tiến hành tuần từ các Delegateđược cùng vào cùng với nhau.

Bạn rất có thể loại quăng quật Delegatetrong multicast bởi toán tử -.

Ví dụ:

class Program delegate int My
Delegate(string s); static void Main(string<> args) Console.Output
Encoding = Encoding.Unicode; My
Delegate convert
To
Int = new My
Delegate(Convert
String
To
Int); My
Delegate show
String = new My
Delegate(Show
String); My
Delegate multicast = convert
To
Int + show
String; string number
STR = "35"; int value
Converted = convert
To
Int(number
STR);Console.Write
Line("Giá trị đang convert thành int: " + value
Converted); Console.Write
Line("Kết trái khi gọi multicast Delegate"); multicast(number
STR); Console.Read
Line(); static int Convert
String
To
Int(string string
Value) int value
Int = 0; Int32.Try
Parse(string
Value, out value
Int); Console.Write
Line("Đã ép kiểu tài liệu thành công"); return value
Int; static int Show
String(string string
Value) Console.Write
Line(string
Value); return 0; Kết quả: khi chạy chương trình

*

Dùng lại ví dụ của phần trước.

Mình sinh sản thêm hàm Show
String với mục dích là xuất ra screen Console chuỗi truyền vào. Mình tạo thành thêm 2 Delegatelà show
String tham chiếu tới hàm Show
String cùng multicast là hiệu quả cộng của 2 Delegateconvert
To
Int với show
String .

Mình hotline Delegatemulticast để thực hiện 1 lần 2 Delegatetuần từ là convert
To
Int cùng show
String.

Console.Write
Line("Kết quả khi điện thoại tư vấn multicast Delegate");multicast(number
STR);Khi cần đào thải Delegatetrong multicast chúng ta chỉ việc trừ Delegatera

multicast = multicast - show
String;

Dùng Delegate cho call-back function

Như tôi đã nói sinh sống trên,Delegatecũng là một trong những biến. Vậy đề nghị mình có thể truyền Delegatevào hàm làm cho parameter như biến hóa bình thường. Hôm nay Delegatenày sẽ tiến hành gọi là call-back function. Mục tiêu của việc này là hàm dìm call-back function là param hoàn toàn có thể gọi Delegateđược chuyển vào lúc nào cần như ví dụ như sau:

delegate int My
Delegate(string s); static void Main(string<> args) Console.Output
Encoding = Encoding.Unicode; My
Delegate show
String = new My
Delegate(Show
String); Nhap
Va
Show
Ten(show
String);Console.Read
Line(); static void Nhap
Va
Show
Ten(My
Delegate show
Ten) Console.Write
Line("Mời nhập tên của bạn:"); string ten = Console.Read
Line(); show
Ten(ten); static int Show
String(string string
Value) Console.Write
Line(string
Value); return 0; Kết quả: khi chạy chương trình:

*

Như chúng ta thấy, mình đã sử dụng Delegatelàm call-back function thành công.

Ý nghĩa của lấy ví dụ như là mỗi khi người tiêu dùng nhập vào tên của bản thân mình thì sẽ gọi Delegate
Show
String để hiển thị tên người tiêu dùng vừa nhập vào ra màn hình console. Vậy lúc này hàm Show
String này trả toàn hoàn toàn có thể được có mang do người dùng mà không nên can thiệp vào code của hàm Nhap
Va
Show
Ten.

Kết luận

Nội dung bài xích này giúp các bạn nắm được:

Delegate là gì?
Khai báo Delegate vào C#Khởi chế tác Delegate trong C#Multicast(đa hướng) một Delegate trong C#Cách dùng Delegate trong C#Dùng Delegate như một call-back function

Bài học tập sau họ sẽ cùng mày mò về event TRONG C#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy nhằm lại bình luận hoặc góp ý của chính mình để phạt triển bài viết tốt hơn. Đừng quên “Luyện tập – thách thức – không lo ngại khó”.

Thảo luận

Nếu bạn có ngẫu nhiên khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt thắc mắc trong phần BÌNH LUẬN bên dưới hoặc vào mục HỎI và ĐÁP trên tủ sách chuyenly.edu.vn.com để nhận thấy sự cung cấp từ cùng đồng.