委托
委托是一种类型,表示对具有特定参数列表和返回类型的方法的引用。它可以看作是一个函数指针,允许你在运行时动态地调用方法。委托可以绑定多个方法,这些方法会按顺序被调用。
用法:
1.当作函数指针,实现对函数的注册,多个注册调用
2.当作回调函数,方法的参数,去定制化方法内容
实际用法:
声明委托 delegate void foo()
创建委托实例 var newfoo = new foo(需要传入参数)
调用 newfoo() 或者 newfoo.invoke()
为委托注册 newfoo += 一个返回值和参数和委托相同的方法
当作方法参数.
细节:
强类型委托Action与Func:他们是.net对于委托的封装,叫做强类型委托,简而言之就是提前写好的委托类型,可以直接使用。Action是无返回值void,Func是有返回值< , , 返回值>。
Lambda表达式:可以看作是委托的匿名函数的方便写法
返回值:如果你的委托有返回值,那么返回的是最后的那个方法
问题:
委托和函数指针的区别
委托和接口的区别
委托示例
public delegate void NotifyEventHandler(string message);
class Program
{
static void Main()
{
NotifyEventHandler notify = null;
notify += Notify1;
notify += Notify2;
notify("Hello, delegates!");
}
static void Notify1(string message)
{
Console.WriteLine("Notify1 received: " + message);
}
static void Notify2(string message)
{
Console.WriteLine("Notify2 received: " + message);
}
}
事件
事件是基于委托的一种特殊成员(实例),用于封装多播委托并限制其访问权限。事件在类的外部只能被触发(调用)和订阅(注册/取消注册),不能直接赋值或清空。这种机制增加了安全性和封装性,确保事件只能由定义它的类来触发。
事件的本质
所以可实现自定义接口
区别(个人理解):
委托是一种用于动态地调用方法的类型(类似于函数指针),而事件是对委托的高级封装(感觉类似于字段与属性的关系),封装了委托,让委托需要通过一层设定好的逻辑来进行触发和订阅(增加方法),就是不能够直接再类的外面访问,需要再事件发布者类中,定义好触发事件的方法。
用法:
一个类的某些成员在发生变化的时候能被外界观测到
.NET标准事件模式
Delegate EventHander(object sender, EventArgs e)
命名规范:
名字+动词被动 OnEventRaised
注册的事件 On + 事件
事件示例
using System;
public delegate void NotifyEventHandler(string message);
public class Publisher
{
// 定义事件
public event NotifyEventHandler Notify;
public void RaiseEvent(string message)
{
if (Notify != null)
{
Notify(message);
}
}
}
public class Subscriber
{
public void OnNotify(string message)
{
Console.WriteLine("Subscriber received: " + message);
}
}
class Program
{
static void Main()
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
// 订阅事件
publisher.Notify += subscriber.OnNotify;
// 触发事件
publisher.RaiseEvent("Hello, events!");
}
}
关键区别
-
封装性和安全性:
- 委托:可以在类外部直接赋值、清空或调用,这可能会带来安全问题。例如,某个代码片段可以意外地清空或替换所有已注册的委托。
- 事件:只能在类内部触发(调用)和清空,外部代码只能订阅或取消订阅。这增加了对事件的控制和保护,防止外部代码意外地修改事件的订阅者列表。
-
设计意图:
- 委托:用于函数指针和回调,主要用于定义方法的引用,允许动态调用方法。
- 事件:用于发布-订阅模式,主要用于通知和响应机制,强调的是一种消息传递和响应机制。
-
使用场景:
- 委托:适用于需要直接调用方法或实现回调机制的场景。
- 事件:适用于需要实现发布-订阅模式的场景,如GUI编程中的按钮点击、异步编程中的通知等。
区别(个人理解):
委托是一种用于动态地调用方法的类型(类似于函数指针),而事件是对委托的高级封装(感觉类似于字段与属性的关系),封装了委托,让委托需要通过一层设定好的逻辑来进行触发和订阅(增加方法),就是不能够直接再类的外面访问,需要再事件发布者类中,定义好触发事件的方法。