Thông tin liên hệ
- 036.686.3943
- admin@nguoicodonvn2008.info
Delegate trong C# là gì? Nếu chưa biết câu trả lời, mời bạn tham khảo những điều cần biết về 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++. Delegate là một biến kiểu tham chiếu chứa 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 dẫn xuất ngầm từ lớp System.Delegate trong C#.
Khai báo Delegate trong C# xác định các phương thức có thể được Delegate tham chiếu. 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ụ, xét delegate sau:
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 nào 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 <kiểu_trả_về> <tên_delegate> <danh_sách_tham_số>
Khi kiểu delegate được khai báo, đối tượng delegate phải được tạo với từ khóa new 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 delegate để tham chiếu các phương thức, lấy tham số nguyên (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) {
//tạo thể hiện delegate
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
//gọi phương thức sử dụng đối tượng delegate
nc1(25);
Console.WriteLine("Giá trị của số: {0}", getNum());
nc2(5);
Console.WriteLine("Giá trị của số: {0}", getNum());
Console.ReadKey();
}
}
}
Khi chạy code trên bạn sẽ nhận được kết quả như sau:
Giá trị của số: 35 Giá trị của số: 175
Các đối tượng Delegate có thể được hợp thành từ các delegate khác nhờ 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 mới 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 khỏi một delegate được hợp thành.
Sử dụng đặ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 QTMCSharp {
class Tester {
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) {
//tạo các thể hiện delegate
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;
//gọi multicast
nc(5);
Console.WriteLine("Giá trị của số: {0}", getNum());
Console.ReadKey();
}
}
}
Kết quả khi chạy chương trình trên sẽ như sau:
Giá trị của số: 75
Ví dụ dưới đây sẽ 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 nhận input là một string 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 QTMCsharp {
class TestCsharp {
static FileStream fs;
static StreamWriter sw;
// khai báo delegate
public delegate void printString(string s);
// phương thức thứ nhất để in trên console
public static void WriteToScreen(string str) {
Console.WriteLine("Chuỗi la: {0}", str);
}
//phương thức thứ hai để ghi dữ liệu vào 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();
}
// phương thức này nhận delegate làm tham số và
// sử dụng nó để gọi các phương thức nếu cần.
public static void sendString(printString ps)
{
ps("Quantrimang.com");
}
static void Main(string[] args)
{
Console.WriteLine("Ví dụ về Delegate C#:");
Console.WriteLine("--------------------------");
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
sendString(ps1);
sendString(ps2);
Console.ReadKey();
}
}
}
Biên dịch và chạy chương trình C# trên để xem kết quả.
Ví dụ về Delegate C#: -------------------------- Chuỗi là: Quantrimang.com
Ưu điểm:
Nhược điểm:
Nhìn chung, Delegate trong C# là lựa chọn phù hợp để lập trình hướng đối tượng. Chỉ cần nắm được những kiến thức cơ bản kể trên, bạn có thể sử dụng delegate C# dễ dàng.
Nguồn tin: Quantrimang.com
Ý kiến bạn đọc
Những tin mới hơn
Những tin cũ hơn
Hướng dẫn tìm kiếm trò chuyện trên Gemini
8 công cụ viết AI tốt nhất hiện nay
Cách gỡ Gemini khỏi thanh tìm kiếm trong Google Photos
Quản lý tài liệu trong kho kiến thức ElevenAgents
Generative Orchestration trong Copilot Studio: Cách agent đưa ra quyết định
Cách chỉnh sửa và nâng cấp câu hỏi bằng Wayground AI
Cách kết nối Claude với Gamma tạo website, slide thuyết trình
Hướng dẫn lọc và xóa thư với Plugin Gmail trong ChatGPT
11 trang web xem phim miễn phí vẫn hoạt động vào năm 2026
Hướng dẫn dùng Wayground AI để tạo bài kiểm tra
Hướng dẫn sử dụng Claude Slides tạo bài thuyết trình
Cách dùng plugin Wayground với ChatGPT
Ký tự khoảng trống FF là gì? Cách tạo tên trống trong Free Fire
Nâng cao khả năng ElevenAgents bằng cơ sở kiến thức quy mô lớn sử dụng RAG
100 ChatGPT/Gemini code giúp bạn chỉnh sửa ảnh như một chuyên gia
Cách thêm nhiều tài khoản Gmail vào plugin Gmail trên ChatGPT
Claude Design là gì? Cách dùng Claude Design thiết kế giao diện web
Làm sao để không còn nhận được những câu trả lời chung chung khi nhập prompt vào Claude nữa?
Hướng dẫn quản lý và ngắt kết nối ứng dụng trên ChatGPT
Hướng dẫn thiết lập thông báo giờ nghỉ trên Claude
Hướng dẫn cài đặt và sử dụng n8n trên Windows 11
Cách lập trình chuyên nghiệp hơn, dễ dàng hơn với tính năng Tệp trên Grok
Công thức tính diện tích hình Elip
Hướng dẫn ngắt kết nối ứng dụng trên ChatGPT
Hướng dẫn tạo đoạn hội thoại cho topic trên Twee
Bức tranh tổng quan về hỗ trợ khách hàng tích hợp AI
6 cách mở Computer/System Properties trong Windows 10
Đừng chia sẻ ảnh cho đến khi bạn chạy kiểm tra siêu dữ liệu này!
Cách sửa lỗi There Are Currently No Power Options Available Windows
Hướng dẫn 8 cách mở bàn phím ảo trên Windows 10