C# 中的 委托(delegate)详解(c#委托有几种)

C# 中的 委托(delegate)详解(c#委托有几种)

编码文章call10242025-02-01 3:30:4223A+A-

C# 中的 委托(delegate) 类似于 C 或 C++ 中的函数指针。它是一种引用类型变量,用于存储对某个方法的引用。让我们深入了解委托的特性和用途:

  1. 引用方法
  2. 委托允许你将方法作为参数传递给其他方法。
  3. 通过委托实例,你可以关联到具有兼容签名和返回类型的任何方法。
  4. 例如,事件处理程序本质上就是通过委托调用的方法。你可以创建自定义方法,然后在某个事件发生时,类似于 Windows 控件,调用你的方法。
  5. 灵活性
  6. 任何匹配委托类型的可访问类或结构中的方法都可以分配给委托。
  7. 方法可以是静态方法或实例方法。
  8. 这种灵活性使你可以在现有类中编程更改方法调用或插入新代码。
  9. 方法签名
  10. 在方法重载的上下文中,方法的签名不包括返回值。但在委托的上下文中,签名包括返回值。
  11. 换句话说,方法必须具有与委托相同的返回类型。
  12. 这种能够将方法作为参数引用的能力使委托非常适合定义回调方法。
  13. 链式调用
  14. 委托可以链接在一起,例如,可以在单个事件上调用多个方法。
  15. Lambda 表达式
  16. Lambda 表达式是一种更简洁的内联代码块的写法。
  17. 在某些上下文中,Lambda 表达式会被编译成委托类型。

总之,委托是一种安全地封装方法的类型,类似于 C 和 C++ 中的函数指针,但委托是面向对象、类型安全且安全的。它们在实现事件和回调方法时特别有用123。

C# 中,委托(Delegate) 是一种强大的工具,用于传递方法引用。让我们一起了解如何声明、实例化和使用委托:

  1. 声明委托
  2. 委托的关键字是 delegate。
  3. 你可以声明一个委托类型,就像声明类一样。
  4. 委托的定义包括返回值类型、委托名称和方法参数。
  5. 例如:// 声明一个委托 delegate void NotifyCallback(string str);
  6. 实例化委托
  7. 在使用委托之前,你需要实例化它。
  8. 可以通过以下几种方式实例化委托:
  9. 使用匹配签名声明委托类型并声明方法:
  10. // 声明一个方法,与委托具有相同的签名 static void Notify(string name) { Console.WriteLine($"Notification received for: {name}"); } // 创建委托实例 NotifyCallback del1 = new NotifyCallback(Notify);
  11. 使用更简洁的方式声明委托实例(C# 2.0 及以上版本):
  12. // 直接赋值给委托实例 NotifyCallback del2 = Notify;
  13. 使用匿名方法:
  14. // 使用匿名方法实例化委托 NotifyCallback del3 = delegate(string name) { Console.WriteLine($"Notification received for: {name}"); };
  15. 使用 Lambda 表达式:
  16. // 使用 Lambda 表达式实例化委托 NotifyCallback del4 = name => { Console.WriteLine($"Notification received for: {name}"); };
  17. 使用委托
  18. 委托实例可以调用与其关联的方法。
  19. 你可以将多个方法关联到同一个委托实例。
  20. 委托提供了一种动态调用方法的方式。

下面是一个示例,演示了如何声明、实例化和使用委托:

// 声明一个委托类型
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.

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4