C#学习第13天:委托(Delegate)

什么是委托?


  • 定义:委托是一种引用类型,用于封装具有特定参数列表和返回类型的方法。
  • 作用:允许方法作为参数传递,并支持事件驱动编程。委托可以封装静态方法和实例方法。

定义和使用委托


定义委托

  • 语法:public delegate 返回类型 委托名(参数类型 参数名, ...)
public delegate int Calculate(int x, int y);

使用委托

// 方法匹配委托签名
public static int Add(int a, int b)
{
    return a + b;
}

public static void Main()
{
    // 创建委托实例并绑定方法
    Calculate calc = Add;
    
    // 调用委托
    int result = calc(5, 3);
    Console.WriteLine($"Result: {result}"); // 输出:Result: 8
}

多播委托


一个委托实例可以引用多个方法,所有方法按顺序调用。仅最后一个方法的返回值被返回。

public delegate void Notify(string message);

public class MultiDelegateExample
{
    public static void SuccessMessage(string msg)
    {
        Console.WriteLine($"Success: {msg}");
    }

    public static void ErrorMessage(string msg)
    {
        Console.WriteLine($"Error: {msg}");
    }

    public static void Main()
    {
        Notify notify = SuccessMessage;
        notify += ErrorMessage;

        // 执行所有方法
        notify("Operation completed.");
    }
}

Func 和 Action


Func

  • Func<T, TResult>:用于表示具有T类型参数且返回TResult类型结果的方法。
  • 底层实现为: public delegate TResult Func<in T, out TResult>(T arg);
  • 相比于Action多了一个返回值
Func<int, int, int> subtract = (a, b) => a - b;
Console.WriteLine(subtract(10, 3)); // 输出:7

Action

  • Action<T>:用于没有返回值的方法。
  • 底层实现为: public delegate void Action<in T>(T obj);
Action<string> showMessage = msg => Console.WriteLine(msg);
showMessage("Hello, Action!"); // 输出:Hello, Action!

 匿名方法和Lambda表达式


匿名方法

  • 提供了一种定义内联方法的方式,不需要命名。
Calculate multiply = delegate(int x, int y) 
{
    return x * y;
};
Console.WriteLine(multiply(4, 5)); // 输出:20

Lambda表达式

  • 是创建匿名方法的简洁形式,常用于LINQ和事件处理。
Calculate divide = (x, y) => x / y;
Console.WriteLine(divide(20, 5)); // 输出:4

使用场景


事件处理

  •  在GUI应用程序中,委托常用于定义事件响应函数。

回调机制

  •  用于异步编程中,指定任务完成后的操作。

策略模式

  • 通过将行为以委托形式传递,实现不同算法之间的切换。

实践习题 


1. 基本委托
定义一个委托类型Calculate,用于封装加减乘除方法。在主程序中,通过委托调用这些方法。

using System;

public delegate int Calculate(int x, int y);

public class CalculatorExample
{
    public static int Add(int a, int b) => a + b;
    public static int Subtract(int a, int b) => a - b;
    public static int Multiply(int a, int b) => a * b;
    public static int Divide(int a, int b) => a / b;

    public static void Main()
    {
        Calculate calc;

        calc = Add;
        Console.WriteLine($"Add: {calc(10, 5)}");

        calc = Subtract;
        Console.WriteLine($"Subtract: {calc(10, 5)}");

        calc = Multiply;
        Console.WriteLine($"Multiply: {calc(10, 5)}");

        calc = Divide;
        Console.WriteLine($"Divide: {calc(10, 5)}");
    }
}

2. 事件模拟
模拟一个简单的事件系统,定义一个事件委托EventHandler,创建一个触发事件的方法,并在主程序中注册事件处理器。

using System;

public delegate void EventHandler(string message);

public class EventSimulator
{
    public static event EventHandler OnEventOccurred;

    public static void TriggerEvent(string message)
    {
        if (OnEventOccurred != null)
            OnEventOccurred(message);
    }
}

public class Program
{
    public static void Main()
    {
        // 注册事件处理器
        EventSimulator.OnEventOccurred += HandleEvent;

        // 触发事件
        EventSimulator.TriggerEvent("An event has occurred.");
    }

    static void HandleEvent(string message)
    {
        Console.WriteLine($"Handling event: {message}");
    }
}

以上示例展示了如何定义和使用委托以及事件处理机制。如果有任何问题或者想要更深入了解某个方面,请随时告诉我! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ghost143

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值