欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > C#学习第13天:委托(Delegate)

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

2025/4/19 17:20:32 来源:https://blog.csdn.net/ghost143/article/details/147230467  浏览:    关键词: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}");}
}

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词