注册
|
登录
发帖
热搜
活动
交友
discuz
论坛
BBS
翼度工具
翼度网址导航
开发工具
Linux命令速查
网页设计配色表
在线制作icon
颜色代码选取器
翼度科技
»
论坛
›
编程开发
›
.net
›
查看内容
返回列表
发新帖
C# - 委托与事件
顽强的生命力
顽强的生命力
当前离线
积分
24
8
主题
8
帖子
24
积分
新手上路
新手上路, 积分 24, 距离下一级还需 26 积分
新手上路, 积分 24, 距离下一级还需 26 积分
积分
24
发消息
显示全部楼层
委托与事件
委托
查看代码
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher("篮球先锋报");
Observer observerA = new Observer("老A");
publisher.Magazine += observerA.RecvMagazine;
Observer observerB = new Observer("老B");
publisher.Magazine += observerB.RecvMagazine;
publisher.PublishMagezine();
//或者使用下面的方式 区别就是一个在定义的内部触发,一个在外部触发
publisher.Magazine?.Invoke(publisher.magazineName);
Console.ReadKey();
}
}
public class Observer
{
private string name;
public Observer(string name)
{
this.name = name;
}
public void RecvMagazine(string message)
{
Console.WriteLine($"{this.name} recv {message}, 仔细读了一番");
}
}
public class Publisher
{
public string magazineName;
public Publisher(string magazineName)
{
this.magazineName = magazineName;
}
public delegate void MagazineDelegate(string message);
public MagazineDelegate Magazine;
public void PublishMagezine()
{
Magazine?.Invoke(this.magazineName);
}
}
复制代码
事件
查看代码
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher("篮球先锋报");
Observer observerA = new Observer("老A");
publisher.Magazine += observerA.RecvMagazine;
Observer observerB = new Observer("老B");
publisher.Magazine += observerB.RecvMagazine;
publisher.PublishMagezine();
//下面的方式会出现编译错误 只允许在定义的内部触发,不允许在外部触发
publisher.Magazine?.Invoke(publisher.magazineName);
Console.ReadKey();
}
}
public class Observer
{
private string name;
public Observer(string name)
{
this.name = name;
}
public void RecvMagazine(string message)
{
Console.WriteLine($"{this.name} recv {message}, 仔细读了一番");
}
}
public class Publisher
{
public string magazineName;
public Publisher(string magazineName)
{
this.magazineName = magazineName;
}
public delegate void MagazineDelegate(string message);
public event MagazineDelegate Magazine;
public void PublishMagezine()
{
Magazine?.Invoke(this.magazineName);
}
}
复制代码
经典面试题
猫叫、老鼠跑了,主人醒来了
查看代码
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse m = new Mouse(cat);
People p = new People(cat);
cat.Scream();
}
}
public class Cat
{
public delegate void ScreamHandler();
public event ScreamHandler OnScream;
public void Scream()
{
Console.WriteLine("猫叫了一声");
OnScream?.Invoke();
}
}
public class Mouse
{
public Mouse(Cat c)
{
c.OnScream += () => { Console.WriteLine("老鼠跑了"); };
}
}
public class People
{
public People(Cat c)
{
c.OnScream += () => { Console.WriteLine("主人醒来了"); };
}
}
//输出:
//猫叫了一声
//老鼠跑了
//主人醒来了
复制代码
委托与事件的区别
事件基于委托,但并非委托
可以把事件看成委托的代理。在使用者看来,只有事件,而没有委托。
事件是对委托的包装
保护委托字段,对外不开放。所以外部对象没法直接操作委托。提供了Add和Remove方法,供外部对象订阅事件和取消事件。事件的处理方法在对象外部定义,而事件的执行是在对象的内部。至于事件的触发,何时何地无所谓。
什么时候使用委托与事件?
如果一个委托不需要再其定义的类之外被触发,那么就可以将其转化为事件,这样可以保证它不会在外部被随意触发。
来源:
https://www.cnblogs.com/ShenhaoCore/p/18181643
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
上一篇:
解析 ABP vNext 依赖注入实现【属性注入】的原理
下一篇:
C#动态查询:巧用Expression组合多条件表达式
发表于 2024-5-9 16:46:49
举报
回复
使用道具
分享
返回列表
发新帖
本版积分规则
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
快速回复
快速回复
返回顶部
返回顶部
返回列表
返回列表