- 委托是存储对某个方法进行引用的引用类型变量,该变量可以作为其它方法的参数进行传递。
- 与C中函数指针的异同:(同)都可以实现以引用的方式对某个方法进行访问和执行。(异)函数指针不是类型安全的,无法得知指针实际指向,也无法得知方法的参数与返回类型。委托是类型安全的,可以清晰得知方法定义的参数和返回类型。
// 派生自 System.Delegate 类 using System; // 委托声明 // delegate(二)委托的意义public delegate int MyDelegateClass(int value); // 创建委托实例 // 使用 new 关键字创建, Func1 是某方法 MyDelegateClass FuncHandler = new MyDelegateClass(Func1)
- 实现 事件(Event) 和 回调方法
- 先定义一个方法
using System;
namespace MyApp
{
class A
{
// 定义一个用于委托的方法
public static int AddNumber(int num1, int num2)
{
return num1 + num2;
}
}
}
- 使用
using System;
using MyApp;
namespace MyProject
{
// 委托声明
delegate int NumberComputeDelegate(int a, int b);
public class MainClass
{
public static void Main(string[] args)
{
// 创建委托实例
NumberComputeDelegate AddNumberHandler = new NumberComputeDelegate(A.AddNumber);
// 使用实例
Console.WriteLine("Compute Value: {0}", AddNumberHandler(1,2)); // Compute Value: 3
}
}
}
二、事件(Event) (一)事件是什么
- 事件可以是用户操作(按键、点击、鼠标移动),也可以是系统通知(中断)。
- 与委托的关系。委托被编译成一个类,可以像类一样在任何地方定义;事件在类中声明定义,当事件被触发时,通过委托调用事件处理程序。
// 首先,声明事件的委托类型 public delegate void MyDelegateClass(); // 其次,基于委托声明与定义事件 public event MyDelegateClass EventTrigger;(二)为什么使用事件
- 用户操作:具有不可预测性,定义事件用于被动等待其发生,并作出响应。
- 系统通知:事件机制,可用于进程间通信。
- 发布-订阅(publisher-subscriber) 模型
发布器(publisher) 是一个包含 委托声明、事件定义、事件与委托间联系定义 的类。
订阅器(subscriber) 是一个提供 事件处理程序 的类。
发布器(publisher)类使用委托调用订阅器(subscriber)类中的方法(事件处理程序)。
using System;
namespace SimpleEvent
{
public class EventPublisher
{
private int num;
public EventPublisher() => SetValue(0);
// 事件定义
public void SetValue(int n)
{
if (num != n)
{
num = n;
OnNumChange();
}
}
// 声明委托
public delegate void NumberChangedDelegate();
// 基于委托,声明事件触发器
// 默认值为null的可空引用类型写法:
// public event NumberChangedDelegate? ChangeNumTrigger = null;
public event NumberChangedDelegate ChangeNumTrigger;
// 事件-委托间联系定义
protected virtual void OnNumChange()
{
if (ChangeNumTrigger != null)
// 调用委托(已绑定的事件处理程序)
ChangeNumTrigger();
}
}
public class EventSubscriber
{
// 事件处理程序定义
public virtual void EventRespond()
{
Console.WriteLine( "event fire" );
}
}
}
- 使用
using System; using SimpleEvent; // 实例化发布器、订阅器 EventPublisher ep1 = new EventPublisher(); EventSubscriber es1 = new EventSubscriber(); // 为事件触发器注册事件订阅器 ep1.ChangeNumTrigger += new EventPublisher.NumberChangedDelegate(es1.EventRespond); // 事件 ep1.SetValue(5); // event fire ep1.SetValue(5); ep1.SetValue(10); // event fire
参考
- 菜鸟教程:C# 委托
- Unity面试手册:C# 中的委托是什么?
- 详解c# 可空类型(Nullable)



