C# 中的 委托(delegate) 类似于 C 或 C++ 中的函数指针。它是一种引用类型变量,用于存储对某个方法的引用。让我们深入了解委托的特性和用途:
- 引用方法:
- 委托允许你将方法作为参数传递给其他方法。
- 通过委托实例,你可以关联到具有兼容签名和返回类型的任何方法。
- 例如,事件处理程序本质上就是通过委托调用的方法。你可以创建自定义方法,然后在某个事件发生时,类似于 Windows 控件,调用你的方法。
- 灵活性:
- 任何匹配委托类型的可访问类或结构中的方法都可以分配给委托。
- 方法可以是静态方法或实例方法。
- 这种灵活性使你可以在现有类中编程更改方法调用或插入新代码。
- 方法签名:
- 在方法重载的上下文中,方法的签名不包括返回值。但在委托的上下文中,签名包括返回值。
- 换句话说,方法必须具有与委托相同的返回类型。
- 这种能够将方法作为参数引用的能力使委托非常适合定义回调方法。
- 链式调用:
- 委托可以链接在一起,例如,可以在单个事件上调用多个方法。
- Lambda 表达式:
- Lambda 表达式是一种更简洁的内联代码块的写法。
- 在某些上下文中,Lambda 表达式会被编译成委托类型。
总之,委托是一种安全地封装方法的类型,类似于 C 和 C++ 中的函数指针,但委托是面向对象、类型安全且安全的。它们在实现事件和回调方法时特别有用123。
在 C# 中,委托(Delegate) 是一种强大的工具,用于传递方法引用。让我们一起了解如何声明、实例化和使用委托:
- 声明委托:
- 委托的关键字是 delegate。
- 你可以声明一个委托类型,就像声明类一样。
- 委托的定义包括返回值类型、委托名称和方法参数。
- 例如:// 声明一个委托 delegate void NotifyCallback(string str);
- 实例化委托:
- 在使用委托之前,你需要实例化它。
- 可以通过以下几种方式实例化委托:
- 使用匹配签名声明委托类型并声明方法:
- // 声明一个方法,与委托具有相同的签名 static void Notify(string name) { Console.WriteLine($"Notification received for: {name}"); } // 创建委托实例 NotifyCallback del1 = new NotifyCallback(Notify);
- 使用更简洁的方式声明委托实例(C# 2.0 及以上版本):
- // 直接赋值给委托实例 NotifyCallback del2 = Notify;
- 使用匿名方法:
- // 使用匿名方法实例化委托 NotifyCallback del3 = delegate(string name) { Console.WriteLine($"Notification received for: {name}"); };
- 使用 Lambda 表达式:
- // 使用 Lambda 表达式实例化委托 NotifyCallback del4 = name => { Console.WriteLine($"Notification received for: {name}"); };
- 使用委托:
- 委托实例可以调用与其关联的方法。
- 你可以将多个方法关联到同一个委托实例。
- 委托提供了一种动态调用方法的方式。
下面是一个示例,演示了如何声明、实例化和使用委托:
// 声明一个委托类型
public delegate void ProcessBookCallback(Book book);
// 书籍结构
public struct Book
{
public string Title;
public string Author;
public decimal Price;
public bool Paperback;
}
// 书店数据库类
public class BookDB
{
private ArrayList list = new ArrayList();
public void AddBook(string title, string author, decimal price, bool paperBack)
{
list.Add(new Book(title, author, price, paperBack));
}
public void ProcessPaperbackBooks(ProcessBookCallback processBook)
{
foreach (Book b in list)
{
if (b.Paperback)
{
processBook(b); // 调用委托
}
}
}
}
// 使用委托的客户端代码
class Test
{
static void PrintTitle(Book b)
{
Console.WriteLine(b.Title);
}
static void Main()
{
BookDB bookDB = new BookDB();
// 初始化数据库
// ...
// 打印平装书的标题
Console.WriteLine("Paperback Book Titles:");
bookDB.ProcessPaperbackBooks(PrintTitle);
}
}
这个示例展示了如何使用委托来处理书店数据库中的平装书。委托提供了一种良好的分离功能,使客户端代码不需要知道具体的存储和查找细节,而只关心如何处理书籍123。
2024/2/21
(1) Delegates - C# Programming Guide - C# | Microsoft Learn. https://learn.microsoft.com/en-US/dotnet/csharp/programming-guide/delegates/.
(2) C# 委托(Delegate) | 菜鸟教程.
https://www.runoob.com/csharp/csharp-delegate.html.
(3) Using Delegates - C# Programming Guide - C# | Microsoft Learn. https://learn.microsoft.com/en-US/dotnet/csharp/programming-guide/delegates/using-delegates.