栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【C# 基础】委托(Delegate)与事件(Event)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C# 基础】委托(Delegate)与事件(Event)

一、委托(Delegate) (一)委托是什么
  • 委托是存储对某个方法进行引用的引用类型变量,该变量可以作为其它方法的参数进行传递。
  • 与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

参考
  1. 菜鸟教程:C# 委托
  2. Unity面试手册:C# 中的委托是什么?
  3. 详解c# 可空类型(Nullable)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/987822.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号